Durante implantações, rollbacks, reduções de escala e reinicializações, uma instância de microsserviço em desligamento ainda pode receber requisições de consumidores que não detectaram o encerramento. Isso causa erros de requisição e perda de tráfego. O recurso de graceful shutdown do Microservices Governance no Microservices Engine (MSE) resolve esse problema ao drenar as requisições em trânsito e notificar os consumidores antes que a instância pare.
Como funciona
Em uma arquitetura de microsserviços típica, uma instância provedora (Provider A) se registra no Microservices Registry para que as instâncias consumidoras (Consumer B) possam descobri-la e chamá-la. Sem o graceful shutdown, ocorre uma condição de corrida quando o Provider A é desligado:
O Provider A inicia o desligamento e o Microservices Registry recebe a notificação do evento.
O Consumer B mantém uma cópia da lista de provedores em cache e não detecta a alteração imediatamente.
O Consumer B continua enviando requisições para o Provider A.
As requisições falham porque o Provider A não está mais disponível.
O graceful shutdown elimina essa lacuna por meio de um processo em duas fases:
Fase de drenagem: Após receber o comando de desligamento, o Provider A continua processando as requisições em trânsito, mas adiciona uma tag especial a cada resposta. Quando o Consumer B recebe uma resposta com essa tag, ele atualiza sua lista de provedores no Microservices Registry e para de rotear novas requisições para o Provider A.
Fase de espera: O Provider A aguarda a conclusão de todas as requisições em trânsito restantes e, em seguida, é desligado.
O graceful shutdown é ativado automaticamente quando o MSE Microservices Governance é habilitado para uma aplicação. Não é necessária configuração manual para a funcionalidade básica. Os recursos de inicialização e desligamento graceful do MSE também oferecem observabilidade para ajudar você a determinar se uma aplicação foi desligada corretamente. Para usar o recurso opcional de notificação proativa, consulte Ativar notificação proativa.
Detalhes de implementação no Kubernetes
Em clusters Kubernetes (ACK), o MSE implementa o graceful shutdown injetando um hook lifecycle.preStop no pod. Esse hook é executado antes que o kubelet envie SIGTERM ao contêiner da aplicação, dando tempo ao MSE para cancelar o registro da instância e drenar o tráfego.
Injeção do hook preStop
O comportamento de injeção depende se o seu contêiner de negócios já possui um hook preStop personalizado:
|
Cenário |
Comportamento de injeção |
|
Nenhum hook |
O MSE injeta um hook |
|
Hook |
O MSE injeta um contêiner sidecar chamado gracefulshutdown com seu próprio hook |
Se o seu hook preStop personalizado apenas cancelar o registro da aplicação no Microservices Registry, remova-o completamente e utilize o hook injetado pelo MSE.
Uso de recursos do contêiner sidecar
O contêiner sidecar gracefulshutdown consome recursos mínimos: 0,05 núcleos de CPU e 50 MiB de memória.
Configure terminationGracePeriodSeconds
O tempo de execução do hook preStop conta para o orçamento de terminationGracePeriodSeconds do pod. O valor padrão de 30 segundos costuma ser insuficiente. Veja como o orçamento de tempo é distribuído:
|
Fase |
Duração |
Descrição |
|
Hook |
~30 s |
O MSE cancela o registro da instância e drena o tráfego |
|
Hook de desligamento da aplicação |
Variável |
A aplicação libera recursos e conexões |
|
SIGKILL (término forçado) |
0 s |
O kubelet encerra forçadamente o contêiner quando o tempo total excede |
Se o tempo combinado do hook preStop e do hook de desligamento da aplicação exceder terminationGracePeriodSeconds, o kubelet envia SIGKILL e a aplicação é terminada à força. Os recursos podem não ser liberados adequadamente.
Defina terminationGracePeriodSeconds como pelo menos 90 na especificação do seu pod:
apiVersion: v1
kind: Pod
spec:
terminationGracePeriodSeconds: 90
containers:
- name: your-app
# ...
Caso seu contêiner de negócios tenha um hook preStop personalizado e a abordagem de sidecar seja utilizada, especifique uma duração de sleep de pelo menos 30 segundos no seu hook preStop personalizado. Isso garante tempo suficiente para que o hook preStop do sidecar conclua o processo de graceful shutdown.
Ative o graceful shutdown
Clusters ACK
Nenhuma ação é necessária. O graceful shutdown é ativado automaticamente quando o MSE Microservices Governance é habilitado para uma aplicação em um cluster Container Service for Kubernetes (ACK).
Instâncias ECS
Adicione o seguinte comando ao início do script de desligamento da sua aplicação:
curl http://127.0.0.1:54199/offline 2>/tmp/null; sleep 30;
Esse comando notifica o MSE para iniciar o processo de graceful shutdown e aguarda 30 segundos para que as requisições em trânsito sejam drenadas.
Verifique o graceful shutdown
Após ativar e acionar o graceful shutdown, verifique se o tráfego foi drenado corretamente na página de governança de aplicações.
Faça login no console do MSE e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Governance > Application Governance. Clique em no cartão de recursos da aplicação desejada.
No painel de navegação à esquerda da página de detalhes da aplicação, clique em Traffic management e, em seguida, clique em na aba Graceful Start/Shutdown.
Na subaba Start and Shutdown Overview, localize e clique em na instância da aplicação desejada. O painel à direita exibe a linha do tempo de eventos de desligamento e o gráfico de QPS.
Um graceful shutdown bem-sucedido mostra o QPS caindo para zero antes que a instância pare. Nenhum tráfego chega à instância após a conclusão do processo de desligamento.

Se o QPS não cair para zero após um evento de desligamento, verifique se há chamadas fora do padrão de microsserviços (como chamadas locais) que ignoram o Microservices Registry.
Os eventos de desligamento são relatados apenas quando a versão do agente do MSE é posterior a 4.2.0. Se os eventos de desligamento não estiverem visíveis, atualize o agente.
Ative a notificação proativa
A notificação proativa é uma funcionalidade avançada de graceful shutdown, desativada por padrão. Ela resolve um problema específico de aplicações Spring Cloud: mesmo após o cancelamento do registro do provedor, um consumidor Spring Cloud pode continuar roteando requisições para ele devido ao seu comportamento interno de cache. Com a notificação proativa ativada, o provedor notifica explicitamente os consumidores durante o desligamento, e estes param imediatamente de enviar requisições.
Quando usar a notificação proativa
Utilize a notificação proativa quando:
Sua aplicação utiliza o framework Spring Cloud e
Ocorrem erros de chamada no consumidor durante o desligamento do provedor, apesar de o graceful shutdown básico estar ativado
Para a maioria dos outros cenários, o comportamento padrão de graceful shutdown é suficiente.
Pré-requisitos
Antes de começar, certifique-se de ter:
Ativado o Microservices Governance. Para mais informações, consulte Ativar o Microservices Governance
Habilitado o Microservices Governance para aplicações em um cluster ACK. Para mais informações, consulte Habilitar o Microservices Governance para aplicações de microsserviços em um cluster ACK
Ative a notificação proativa no console
Faça login no console do MSE e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Governance > Application Governance. Clique em no cartão de recursos da aplicação desejada.
No painel de navegação à esquerda da página de detalhes da aplicação, clique em Traffic management e, em seguida, clique em na aba Graceful Start/Shutdown.
Na seção Settings, clique em Revised. No painel Graceful Start and Shutdown Settings, expanda o bloco Graceful Shutdown, ative a chave Proactive Notification e clique em OK.
Limitações
Graceful shutdown
Em cenários Kubernetes, o graceful shutdown é implementado com base no hook preStop. Essa funcionalidade tem suporte apenas quando os pods param normalmente, incluindo os seguintes cenários:
Redução de escala
Reinicialização
Atualização contínua
O graceful shutdown não se aplica quando os pods param de forma anormal, como durante um OOM kill.
Notificação proativa
O Microservices Governance não oferece suporte ao graceful shutdown para as seguintes aplicações:
Aplicações não Java
Aplicações que não utilizam WebFlux ou Spring MVC
Aplicações provedoras cujos consumidores não são aplicações de microsserviços
Aplicações em que o Microservices Governance está desativado no lado do consumidor ou do provedor