Otimização de parâmetros de drenagem da conexão do balanceador de carga para o Amazon ECS
Para permitir a otimização, os clientes mantêm uma conexão keep alive com o serviço de contêiner. Isto permite que solicitações subsequentes desse cliente reutilizem a conexão existente. Quando quiser interromper o tráfego de um contêiner, você notifica o balanceador de carga. O balanceador de carga verifica periodicamente se o cliente fechou a conexão keep-alive. O agente do Amazon ECS monitora o balanceador de carga e aguarda que ele informe que a conexão keep alive está fechada (o destino está em um estado UNUSED
).
A quantidade de tempo que o balanceador de carga aguarda para mover o destino para o estado UNUSED
equivale ao atraso no cancelamento do registro. Você pode configurar o parâmetro do balanceador de carga a seguir para acelerar as implantações.
-
deregistration_delay.timeout_seconds
: 300 (padrão)
Quando houver um serviço com um tempo de resposta inferior a 1 segundo, defina o parâmetro com o seguinte valor para que o balanceador de carga espere apenas cinco segundos antes de interromper a conexão entre o cliente e o serviço de backend:
-
deregistration_delay.timeout_seconds
: 5
nota
Não defina o valor como cinco segundos quando tiver um serviço com solicitações de longa duração, como uploads lentos de arquivos ou conexões de fluxo.
Capacidade de resposta do SIGTERM
O Amazon ECS primeiro envia um sinal de SIGTERM à tarefa para notificar que a aplicação precisa ser concluída e desligada. Em seguida, o Amazon ECS envia uma mensagem de SIGKILL. Quando as aplicações ignoram o SIGTERM, o serviço do Amazon ECS deve esperar para enviar o sinal de SIGKILL antes de encerrar o processo.
O tempo que o Amazon ECS espera para enviar a mensagem de SIGKILL é determinado pela seguinte opção de agente do Amazon ECS:
-
ECS_CONTAINER_STOP_TIMEOUT
: 30 (padrão)Para obter mais informações sobre o parâmetro do agente de contêiner, consulte Amazon ECS Container Agent
no GitHub.
Para acelerar o período de espera, defina o parâmetro do agente do Amazon ECS com o seguinte valor:
-
ECS_CONTAINER_STOP_TIMEOUT
: 2Se a aplicação levar mais de um segundo, multiplique o valor por dois e use esse número como valor.
Nesse caso, o Amazon ECS aguarda dois segundos para que o contêiner seja desligado e, em seguida, envia uma mensagem de SIGKILL quando a aplicação não é interrompida.
Você também pode modificar o código da aplicação para capturar o sinal de SIGTERM e reagir a ele. O seguinte exemplo está em JavaScript:
process.on('SIGTERM', function() { server.close(); })
Esse código faz com que o servidor HTTP pare de receber novas solicitações, termine de responder a todas as solicitações em andamento e, em seguida, encerra o processo Node.js porque o loop de eventos não tem nada para fazer. Diante disso, se o processo levar apenas 500 ms para concluir as solicitações em andamento, ele é encerrado mais cedo, sem precisar esperar o tempo limite de encerramento e receber um SIGKILL.