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
- Criando um servidor HTTP
- Roteamento e parâmetros de caminho
- Padrão de middleware
- Desligamento elegante