Tengo una API de Java (que acepta solicitudes HTTPS_ empaquetadas en una imagen acoplable, y luego se implementa usando el clúster k8s en la parte superior de EC2. El EC2 maestro tiene un ELB al frente.
Puedo hacer solicitudes POST curl al ELB para golpear esa API de Java.
A veces, mi solicitud de curl se encuentra esperando una respuesta para siempre, aunque cuando veo los registros de Kube, el procesamiento fue exitoso.
Esto sucede para solicitudes más grandes de alrededor de 40 minutos, las solicitudes de 25 minutos obtienen una respuesta correcta.
¿Dónde crees que podría ser el tiempo de espera? ¿Hay algún parámetro de configuración específico que deba mirar?
cliente (curl) -> ELB -> k8s -> pod ejecutando una imagen api de java
pensé que esto sería relevante (no estoy configurando IdleTimeout) para ELB pero los documentos dicen que el valor predeterminado es 60 s, aunque puedo obtener respuesta para solicitudes de 20 minutos "ConnectionSettings": {"IdleTimeout"}
fuente
Respuestas:
Tal como Pampy mencionó en su respuesta, el tiempo de espera de ELB solo cuenta el tiempo de inactividad. Esto puede variar entre 1 y 4000 segundos y está configurado en 60 segundos de forma predeterminada. Puede cambiar el tiempo de espera utilizando la CLI o la consola.
El siguiente es un ejemplo del uso de la CLI para cambiarlo a 5 minutos:
Fuente: docs
Como está cargando archivos grandes que demoran entre 20 y 40 minutos, todavía recomendaría las otras sugerencias sobre el uso de un agente de mensajes como RabbitM o Kafka para manejar la carga y el procesamiento de forma asincrónica.
fuente
El tiempo de espera ELB solo cuenta para el tiempo "inactivo" . Eso significa que mientras su carga aún se esté ejecutando, no estará inactiva. Cuando el archivo llegó a su servidor, debe medir el tiempo hasta que su servidor responda.
Cuando se obtiene eso correctamente, el servidor procesará la solicitud y luego devolverá una respuesta al cliente. Con un tiempo de espera predeterminado de 60 segundos, su servidor tiene estos 60 segundos para procesar el archivo cargado y devolver una respuesta.
¿Quizás su servidor necesita menos de 60 segundos para procesar su carga de 25 minutos, pero más para procesar la carga de 40 minutos?
fuente
¿Por qué no sube el archivo y envía un evento al intermediario de mensajes como rabbitMQ? Realice ETL en los archivos utilizando el objeto kubernetes Job / CronJob de forma asincrónica y, en consecuencia, notifique al cliente.
De esta manera, no tiene que bloquear la solicitud entrante por más tiempo. después de publicar el evento, envíe un mensaje al cliente de que la solicitud se está procesando.
fuente
25 minutos es bastante largo para una solicitud HTTP. Estoy bastante de acuerdo con P Ekambaram.
Creo que podría ser mejor hacer que el punto final sea asíncrono y responder tan pronto como se cargue el archivo (debería ser más rápido), al mismo tiempo, usar mensajería de middleware (RabbitMQ, Kafka o NATS) o Websocket, que empuja un evento una vez que El archivo se ha importado y procesado correctamente.
fuente
use esto en cLI para cambiar el tiempo de espera a 5 minutos
fuente