0Pricing
Go Academy · Aula

Desligamento elegante

Trate sinais do sistema operacional e esvazie as conexões

Desligamento elegante é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.

Por que usar o encerramento ordenado?

Chamar os.Exit ou simplesmente parar o servidor descarta todas as requisições em andamento. O encerramento ordenado aguarda a conclusão das requisições ativas antes de sair.

http.Server.Shutdown

srv.Shutdown(ctx) interrompe a aceitação de novas conexões, aguarda a conclusão das requisições ativas e então retorna. Passe um contexto com um prazo para limitar o tempo de espera.

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
srv.Shutdown(ctx)

Tratamento de sinais

Escute SIGINT/SIGTERM em uma goroutine e chame Shutdown quando receber o sinal:

quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("shutting down...")
srv.Shutdown(ctx)

Padrão completo de encerramento ordenado

Inicie o servidor em uma goroutine; bloqueie no canal de sinais; depois encerre o servidor:

go func() {
    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
        log.Fatal(err)
    }
}()

quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
srv.Shutdown(ctx)

http.ErrServerClosed

Depois que Shutdown for chamado, ListenAndServe retorna http.ErrServerClosed. Trate isso como uma saída normal, não como um erro.

Drenando conexões

Shutdown aguarda todas as conexões assumidas e as conexões WebSocket ativas somente se o próprio manipulador respeitar o cancelamento do contexto. Os manipuladores de espera longa ou de processamento em fluxo devem verificar r.Context().Done().

Limite de tempo do encerramento

Defina um limite de tempo razoável para o encerramento (10 a 30 s). Se ainda houver requisições em execução após o prazo, Shutdown retorna context.DeadlineExceeded e as conexões restantes são fechadas à força.

Limpeza durante o encerramento

Depois que Shutdown retornar, feche os conjuntos de conexões do banco de dados, descarregue os buffers de registro e libere os outros recursos na ordem correta. Use defer ou uma sequência explícita.

srv.Shutdown(ctx)
db.Close()
logger.Sync()

Server.Close versus Server.Shutdown

srv.Close() fecha imediatamente todas as conexões, sem aguardar. Use-o somente quando uma interrupção forçada for aceitável (por exemplo, em testes).

Sonda de prontidão do Kubernetes

Durante o encerramento, faça a sonda de prontidão retornar 503 antes de chamar Shutdown. Isso sinaliza ao balanceador de carga que ele deve parar de encaminhar novas requisições para o pod.

Vários servidores

Se estiver executando vários servidores (HTTP + gRPC + métricas), encerre cada um simultaneamente com goroutines e use um WaitGroup para aguardar até que todos sejam drenados.

Verificação rápida

O que http.Server.Shutdown faz?

Recapitulação: encerramento ordenado

Pontos principais:

  • srv.Shutdown(ctx) interrompe novas conexões e aguarda as ativas
  • Escute SIGINT/SIGTERM com signal.Notify
  • ListenAndServe retorna http.ErrServerClosed durante o encerramento — isso não é um erro
  • Defina um prazo para o encerramento para evitar esperar indefinidamente

Perguntas Frequentes

A aula “Desligamento elegante” é grátis?

Sim — o texto completo de “Desligamento elegante” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.

O que vou aprender em “Desligamento elegante”?

Trate sinais do sistema operacional e esvazie as conexões Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Go Academy?

Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Desligamento elegante”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Go Academy?

Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Criando um servidor HTTP
  2. Roteamento e parâmetros de caminho
  3. Padrão de middleware
  4. Desligamento elegante
← Voltar para Go Academy