Optimización de los parámetros de drenaje de conexiones del equilibrador de carga para Amazon ECS - Amazon Elastic Container Service

Optimización de los parámetros de drenaje de conexiones del equilibrador de carga para Amazon ECS

Para permitir la optimización, los clientes mantienen una conexión permanente con el servicio de contenedores. Esto permite a las solicitudes posteriores de ese cliente reutilizar la conexión existente. Cuando quiera detener el tráfico hacia un contenedor, notifica al equilibrador de carga. El equilibrador de carga hace una comprobación periódica para ver si el cliente cerró la conexión persistente. El agente de Amazon ECS supervisa el equilibrador de carga y espera a que este informe que la conexión Keep Alive está cerrada (el objetivo está en un estado UNUSED).

El tiempo que el equilibrador de carga espera para mover el objetivo al estado UNUSED es el retraso en la cancelación del registro. Puede configurar el siguiente parámetro del equilibrador de carga para acelerar las implementaciones.

  • deregistration_delay.timeout_seconds: 300 (predeterminado)

Si tiene un servicio con un tiempo de respuesta inferior a 1 segundo, establezca el parámetro en el siguiente valor para que el equilibrador de carga solo espere 5 segundos antes de interrumpir la conexión entre el cliente y el servicio de backend:

  • deregistration_delay.timeout_seconds: 5

nota

No establezca el valor en 5 segundos cuando tenga un servicio con solicitudes de larga duración, como cargas lentas de archivos o conexiones de streaming.

Capacidad de respuesta de SIGTERM

Amazon ECS envía primero una señal SIGTERM a la tarea para notificar que la aplicación debe finalizar y cerrarse. A continuación, Amazon ECS envía un mensaje SIGKILL. Cuando las aplicaciones ignoran el SIGTERM, el servicio Amazon ECS debe esperar a enviar la señal SIGKILL para terminar el proceso.

El tiempo que Amazon ECS espera para enviar el mensaje SIGKILL viene determinado por la siguiente opción de agente de Amazon ECS:

  • ECS_CONTAINER_STOP_TIMEOUT: 30 (predeterminado)

    Para obtener más información sobre el parámetro de agente contenedor, consulte Amazon ECS Container Agent en GitHub.

Para acelerar el periodo de espera, defina el parámetro del agente de Amazon ECS en el siguiente valor:

  • ECS_CONTAINER_STOP_TIMEOUT: 2

    Si la solicitud tarda más de 1 segundo, multiplique el valor por 2 y utilice ese número como valor.

En este caso, Amazon ECS espera 2 segundos a que se cierre el contenedor y, a continuación, envía un mensaje SIGKILL cuando la aplicación no se detiene.

También puede modificar el código de la aplicación para capturar la señal SIGTERM y reaccionar ante ella. El siguiente es un ejemplo en JavaScript:

process.on('SIGTERM', function() { server.close(); })

Este código hace que el servidor HTTP deje de aceptar nuevas solicitudes, termine de responder a las solicitudes en curso y, a continuación, finalice el proceso de Node.js porque el bucle de eventos no tiene más tareas pendientes. Por lo tanto, si el proceso tarda solo 500 ms en finalizar sus solicitudes en tránsito, finaliza antes de tiempo sin tener que esperar a que acabe el tiempo de espera y recibir un SIGKILL.