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"}
quelle
Antworten:
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:
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.
quelle
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?
quelle
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.
quelle
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.
quelle
Verwenden Sie dies in cLI, um das Timeout auf 5 Minuten zu ändern
quelle