O desligamento graceful torna o encerramento e a reinicialização de uma aplicação online transparentes para os clientes: as requisições de negócio normais não sofrem impacto desde o momento em que a aplicação para até ela reiniciar e retomar o service. Configure o desligamento graceful ao implantar, parar, reverter, reduzir horizontalmente ou redefinir uma aplicação para garantir seu encerramento adequado. Este tópico descreve o funcionamento do desligamento graceful, como ativá-lo e observá-lo, além das notas de uso aplicáveis.
Por que usar o desligamento graceful
Em uma arquitetura de microsserviços, se você encerrar diretamente uma instância provedora durante períodos de alta concorrência, as instâncias consumidoras podem não detectar a mudança de status da instância provedora a tempo. Os consumidores continuam encaminhando requisições para uma instância já offline, o que causa erros de requisição e perda de tráfego.
Como funciona
Na descrição a seguir, o provedor A é a aplicação em encerramento e o consumidor B é a aplicação que a chama. Quando o provedor A é desligado, ele notifica o Microservices Registry, mas o consumidor B pode não detectar a alteração em tempo real e continuar chamando o provedor A após ele ficar offline. Para evitar isso, o provedor A entra em um período de espera assim que recebe o comando de desligamento e adiciona um marcador especial às respostas de todas as requisições recebidas durante esse intervalo. Ao receber essa resposta e identificar o marcador, o consumidor B consulta as instâncias de service no Microservices Registry uma vez e detecta o status mais recente do provedor A em tempo real. O provedor A também aguarda por um período antes de ser encerrado, garantindo o processamento de todas as requisições em trânsito recebidas antes do desligamento, em vez de interrompê-las abruptamente quando o provedor A parar.
Para qualquer aplicação conectada ao MSE, o desligamento graceful é ativado por padrão, mas a notificação proativa exige configuração manual. O MSE Graceful Start and Shutdown também oferece observabilidade para ajudar você a determinar se a aplicação foi encerrada corretamente.
Quando uma aplicação de microsserviços em um ambiente Container Service for Kubernetes se conecta ao MSE Microservices Governance, as operações de desligamento graceful são injetadas no Pod como um hook lifecycle.preStop e executadas antes da parada do Pod. Portanto, recomendamos não configurar um hook preStop personalizado. Se o seu hook preStop apenas cancelar o registro da aplicação no Microservices Registry, remova-o e utilize o hook preStop que o desligamento graceful injeta automaticamente.
Caso sua lógica de negócio exija operações de encerramento graceful e você já tenha configurado um hook preStop personalizado para o contêiner da aplicação, o desligamento graceful deixará de injetar seu próprio hook preStop no contêiner da sua aplicação. Em vez disso, ele injetará um contêiner sidecar chamado gracefulshutdown e inserirá o hook preStop de desligamento graceful nesse contêiner. Como um contêiner sidecar compartilha o namespace de rede com o contêiner da aplicação por padrão, a execução do hook preStop do sidecar antes da parada do Pod também garante o desligamento graceful para o contêiner da aplicação.
Para garantir a conclusão do hook preStop do contêiner sidecar, inclua uma pausa de pelo menos 30 segundos no hook preStop personalizado do contêiner da aplicação, permitindo o processamento das requisições em trânsito. Defina o parâmetro terminationGracePeriodSeconds no nível do Pod adequadamente, conforme descrito em Usage notes.
O contêiner sidecar consome recursos mínimos. As configurações atuais são CPU: 50m, Memória: 50Mi.
No Kubernetes, o desligamento graceful é implementado com base no hook
preStop. Por isso, atualmente ele suporta o desligamento graceful apenas para encerramentos normais de Pod, como redução horizontal, reinicialização e atualização contínua (rolling upgrade). Não há suporte para desligamento graceful em casos de encerramento anormal, como eliminação por falta de memória (OOM kill).
Ativar o desligamento graceful
Antes de ativar o desligamento graceful, revise Prerequisites e Usage notes. Ative o recurso de acordo com o ambiente onde sua aplicação está implantada:
Se a aplicação estiver implantada em um ambiente Container Service for Kubernetes (ACK), nenhuma operação adicional é necessária para ativar o desligamento graceful após a conexão da aplicação ao MSE Microservices Governance. Por padrão, o desligamento graceful é ativado automaticamente. No entanto, se o contêiner da aplicação já possuir um hook
preStoppersonalizado, ou se o Pod ainda utilizar o valor padrão de 30 paraterminationGracePeriodSeconds, será necessário concluir também as configurações descritas em How it works e Usage notes.-
Para aplicações implantadas em um ambiente Elastic Compute Service (ECS), adicione o conteúdo abaixo ao script de desligamento da aplicação e execute-o no início do script. A requisição para
/offlineinicia o processo de desligamento graceful, esleep 30concede tempo para o processamento das requisições em trânsito antes que o script continue.curl http://127.0.0.1:54199/offline 2>/tmp/null; sleep 30;
Para confirmar que o desligamento graceful entrou em vigor, consulte Observe graceful shutdown.
Observar o desligamento graceful
Depois que o desligamento graceful entrar em vigor para sua aplicação, observe na página Application Governance que o tráfego para uma instância em encerramento é drenado em um curto espaço de tempo e que seu QPS cai rapidamente para 0.
Faça login no MSE console e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha . Na página exibida, clique em no cartão de recursos da aplicação que deseja gerenciar.
Na página de detalhes da aplicação, clique em Traffic management no painel de navegação à esquerda e clique em na aba Graceful Start/Shutdown.
Na aba Start and Shutdown Overview, visualize os eventos ocorridos durante as inicializações e encerramentos recentes da aplicação. Na lista de instâncias iniciadas e encerradas à esquerda, localize a instância em encerramento que deseja visualizar e clique em nela.
Os detalhes à direita mostram que a instância executou o processo de desligamento graceful, que o tráfego foi drenado rapidamente após a conclusão do processo e que nenhum tráfego adicional entrou na instância antes de ela parar.
Se o QPS não cair rapidamente para 0 após a geração de um evento bem-sucedido de desligamento graceful, verifique primeiro se o tráfego vem de fontes diferentes de chamadas de microsserviços, como chamadas locais.
O evento "application stopped" é relatado apenas pela versão 4.2.0 ou posterior do agente. Caso não veja esse evento, considere atualizar o agente.
Notificação proativa
O que é notificação proativa
A notificação proativa é um recurso avançado do desligamento graceful e vem desativada por padrão. Na maioria dos cenários, a solução de encerramento fornecida pelo MSE Graceful Start and Shutdown já resolve o problema. Ative a notificação proativa se a aplicação a ser encerrada utilizar o framework Spring Cloud e as chamadas dos consumidores falharem durante o desligamento. Após ativar esse recurso, uma instância provedora notifica proativamente os consumidores de service durante a fase de encerramento, e os consumidores notificados param de enviar requisições para essa instância provedora.
Pré-requisitos
Notas de uso
O MSE Microservices Governance ainda não suporta o desligamento graceful para as seguintes aplicações:
Aplicações não desenvolvidas em Java.
Aplicações não desenvolvidas com base em WebFlux ou Spring MVC.
Aplicações provedoras downstream cujos consumidores não são aplicações de microsserviços.
Aplicações cuja aplicação consumidora ou provedora não esteja conectada ao MSE Microservices Governance. Tanto a aplicação consumidora quanto a provedora devem estar conectadas ao MSE Microservices Governance para alcançar o desligamento graceful.
O processo de desligamento graceful aguarda por um período para garantir o processamento de todas as requisições em trânsito para a instância em encerramento. Portanto, o valor do parâmetro terminationGracePeriodSeconds na especificação do seu Pod Kubernetes (valor padrão: 30) deve ser maior que 30. Recomendamos definir esse valor como 90. Se você usar o valor padrão 30, o shutdownhook da aplicação pode não terminar de executar, e alguns recursos não poderão ser liberados adequadamente quando a aplicação parar.
Ativar notificação proativa
Faça login no MSE console e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha . Na página exibida, clique em no cartão de recursos da aplicação que deseja gerenciar.
Na página de detalhes da aplicação, clique em Traffic management no painel de navegação à esquerda e clique em na aba Graceful Start/Shutdown.
Na seção Settings, clique em Modify, clique em na seção Graceful Shutdown, ative Proactive Notification e, em seguida, clique em OK.
Para confirmar que a notificação proativa entrou em vigor, observe o próximo desligamento da aplicação conforme descrito em Observe graceful shutdown.