Was sind die Kubernetes / Elb-Timeouts für http-Anfragen?

9

Ich habe eine Java-API (Akzeptiere HTTPS-Anfragen_, die in ein Docker-Image gepackt sind, und dann wird sie mithilfe eines k8s-Clusters über EC2s bereitgestellt. Der Master-EC2 hat eine ELB vor sich.

Ich kann Curl-POST-Anfragen an die ELB senden, um diese Java-API zu erreichen.

Manchmal wartet meine Curl-Anfrage für immer auf eine Antwort, obwohl die Verarbeitung erfolgreich war, wenn ich die Kube-Protokolle sehe.

Dies geschieht bei größeren Anfragen um 40 Minuten, Anfragen von 25 Minuten erhalten eine Antwort in Ordnung.

Wo könnte das Timeout sein? Gibt es bestimmte Konfigurationsparameter, die ich mir ansehen sollte?

client (curl) -> ELB -> k8s -> pod mit einem Java-API-Image

Ich dachte, dies wäre relevant (ich setze IdleTimeout nicht ein) für ELB, aber die Dokumente sagen, dass der Standard 60s ist, obwohl ich eine Antwort auf 20-minütige Anfragen erhalten kann "ConnectionSettings": {"IdleTimeout"}

tooptoop4
quelle
"größere Anfragen um 40 Minuten" was meinst du damit?
Arghya Sadhu
Wenn Sie also eine große Datei hochladen, benötigt die API 40 Minuten, um sie mit dem ETL-Prozess aufzunehmen, und soll dann eine Antwort
zurücksenden
Ich frage mich, warum Sie eine LB vor dem Master haben (Sie meinen API-Server?) Und wie Sie Ihre API erreichen können, wenn Sie diese LB erreichen.
Suren

Antworten:

1

Wie Pampy in seiner Antwort erwähnt hat, zählt das ELB-Timeout nur die Leerlaufzeit. Dies kann zwischen 1 und 4000 Sekunden liegen und ist standardmäßig auf 60 Sekunden eingestellt. Sie können das Zeitlimit über die CLI oder die Konsole ändern.

Im Folgenden finden Sie ein Beispiel für die Verwendung der CLI, um sie auf 5 Minuten zu ändern:

aws elb modify-load-balancer-attributes --load-balancer-name my-loadbalancer --load-balancer-attributes "{\"ConnectionSettings\":{\"IdleTimeout\":300}}"

Quelle: docs

Da Sie große Dateien hochladen, die 20 bis 40 Minuten dauern, würde ich dennoch die anderen Vorschläge zur Verwendung eines Nachrichtenbrokers wie RabbitM oder Kafka empfehlen, um das Hochladen und Verarbeiten asynchron durchzuführen.

Manish Dash
quelle
0

Das ELB-Timeout zählt nur für die Leerlaufzeit . Das heißt, solange Ihr Upload noch läuft, ist er nicht inaktiv. Wenn die Datei auf Ihrem Server angekommen ist, müssen Sie die Zeit messen, bis Ihr Server antwortet.

Wenn dies korrekt ist, verarbeitet der Server die Anforderung und sendet anschließend eine Antwort an den Client. Bei einem Standardzeitlimit von 60 Sekunden verfügt Ihr Server über diese 60 Sekunden, um die hochgeladene Datei zu verarbeiten und eine Antwort zurückzugeben.

Möglicherweise benötigt Ihr Server weniger als 60 Sekunden, um Ihren 25-minütigen Upload zu verarbeiten, aber mehr, um den 40-minütigen Upload zu verarbeiten?

Pampy
quelle
Woher kommen 60 Sekunden? Ich verwende nicht Standard IdleTimeout auf ELB
tooptoop4
60 Sekunden ist das Standard-Leerlaufzeitlimit der ELB. Sie können es nicht "nicht verwenden". Sie können den Wert zwischen 1 Sekunde und 60 Minuten ändern, aber es gibt keine Möglichkeit, die ELB anzuweisen, die Verbindung überhaupt nicht zu beenden.
Pampy
0

Warum laden Sie die Datei nicht hoch und senden ein Ereignis an einen Nachrichtenbroker wie rabbitMQ? Führen Sie eine ETL für die Dateien mit dem kubernetes Job / CronJob-Objekt asynchron durch und benachrichtigen Sie den Client entsprechend.

Auf diese Weise müssen Sie die eingehende Anforderung nicht für längere Zeit blockieren. Nach dem Hochladen des Ereignisses nach Veröffentlichung des Ereignisses senden Sie eine Nachricht an den Client, dass die Anforderung verarbeitet wird.

P Ekambaram
quelle
Ich möchte immer noch herausfinden, wo das Timeout ist
tooptoop4
0

25 Minuten sind für eine HTTP-Anfrage ziemlich lang. Ich stimme P Ekambaram durchaus zu.

Ich denke, es könnte besser sein, den Endpunkt asynchron zu machen und zu antworten, sobald die Datei hochgeladen wird (sollte schneller sein), und gleichzeitig Middleware-Messaging (RabbitMQ, Kafka oder NATS) oder Websocket zu verwenden, die ein Ereignis einmal auslösen Datei wurde erfolgreich importiert und verarbeitet.

nordeen78
quelle
0
 aws elb modify-load-balancer-attributes --load-balancer-name my-loadbalancer --load-balancer-attributes "{\"ConnectionSettings\":{\"IdleTimeout\":300}}"

Verwenden Sie dies in cLI, um das Timeout auf 5 Minuten zu ändern

Sai Vamsi
quelle