J'ai une API Java (acceptant les requêtes HTTPS_ empaquetées dans une image docker, puis elle est déployée à l'aide du cluster k8s au-dessus des EC2. Le maître EC2 a un ELB en face.
Je peux faire des requêtes POST curl à l'ELB afin d'atteindre cette API java.
Parfois, ma demande de bouclage attend une réponse pour toujours, même si lorsque je vois les journaux du kube, le traitement a réussi.
Cela se produit pour les demandes plus importantes d'environ 40 minutes, les demandes de 25 minutes reçoivent une réponse correcte.
Où pensez-vous que le délai pourrait être? des paramètres de configuration spécifiques que je devrais regarder?
client (curl) -> ELB -> k8s -> pod exécutant une image api java
je pensais que ce serait pertinent (je ne configure pas IdleTimeout) pour ELB mais les documents disent que la valeur par défaut est 60s, bien que je puisse obtenir une réponse pour les demandes de 20 minutes "ConnectionSettings": {"IdleTimeout"}
la source
Réponses:
Tout comme Pampy l'a mentionné dans sa réponse, le délai d'attente ELB ne compte que le temps d'inactivité. Cela peut varier entre 1 et 4000 secondes et est défini sur 60 secondes par défaut. Vous pouvez modifier le délai d'expiration à l'aide de la CLI ou de la console.
Voici un exemple d'utilisation de la CLI pour la changer en 5 minutes:
Source: docs
Comme vous téléchargez des fichiers volumineux en 20 à 40 minutes, je recommanderais toujours les autres suggestions sur l'utilisation d'un courtier de messages comme RabbitM ou Kafka pour gérer le téléchargement et le traitement de manière asynchrone.
la source
Le délai d'attente ELB ne compte que pour le temps "inactif" . Cela signifie que tant que votre téléchargement est en cours d'exécution, il n'est pas inactif. Lorsque le fichier est arrivé sur votre serveur, vous devez mesurer le temps jusqu'à ce que votre serveur réponde.
Une fois obtenu correctement, le serveur traitera la demande et retournera une réponse au client par la suite. Avec un délai par défaut de 60 secondes, votre serveur dispose de ces 60 secondes pour traiter le fichier téléchargé et renvoyer une réponse.
Peut-être que votre serveur a besoin de moins de 60 secondes pour traiter votre téléchargement de 25 minutes, mais davantage pour traiter le téléchargement de 40 minutes?
la source
Pourquoi ne téléchargez-vous pas le fichier et ne poussez pas un événement vers le courtier de messages comme rabbitMQ. Exécutez ETL sur les fichiers à l'aide de l'objet kubernetes Job / CronJob de manière asynchrone et informez le client en conséquence.
De cette façon, vous n'avez pas à bloquer la demande entrante plus longtemps. après le téléchargement après la publication de l'événement, envoyez un message au client indiquant que la demande est en cours de traitement.
la source
25 minutes, c'est assez long pour une requête HTTP. Je suis tout à fait d'accord avec P Ekambaram.
Je pense qu'il pourrait être préférable de rendre le point de terminaison asynchrone et de répondre dès que le fichier est téléchargé (devrait être plus rapide), en même temps, utilisez la messagerie middleware (RabbitMQ, Kafka ou NATS) ou Websocket, qui pousse un événement une fois le le fichier a été importé et traité avec succès.
la source
utiliser ceci en cLI pour changer le délai d'attente à 5 min
la source