Todos os produtos
Search
Central de documentação

Microservices Engine:Graceful shutdown

Última atualização: Jun 28, 2026

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:

  1. O Provider A inicia o desligamento e o Microservices Registry recebe a notificação do evento.

  2. O Consumer B mantém uma cópia da lista de provedores em cache e não detecta a alteração imediatamente.

  3. O Consumer B continua enviando requisições para o Provider A.

  4. 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:

  1. 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.

  2. Fase de espera: O Provider A aguarda a conclusão de todas as requisições em trânsito restantes e, em seguida, é desligado.

Nota

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 preStop personalizado

O MSE injeta um hook preStop diretamente no contêiner de negócios

Hook preStop personalizado existente

O MSE injeta um contêiner sidecar chamado gracefulshutdown com seu próprio hook preStop. O sidecar compartilha namespaces de rede com o contêiner de negócios, permitindo que seu hook preStop também acione o graceful shutdown para o contêiner de negócios

Importante

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 preStop

~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 terminationGracePeriodSeconds

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
      # ...
Importante

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.

  1. Faça login no console do MSE e selecione uma região na barra de navegação superior.

  2. No painel de navegação à esquerda, escolha Microservices Governance > Application Governance. Clique em no cartão de recursos da aplicação desejada.

  3. 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.

  4. 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.

Graceful shutdown traffic visualization

Importante

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.

Nota

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:

Ative a notificação proativa no console

  1. Faça login no console do MSE e selecione uma região na barra de navegação superior.

  2. No painel de navegação à esquerda, escolha Microservices Governance > Application Governance. Clique em no cartão de recursos da aplicação desejada.

  3. 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.

  4. 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

Veja também