Ответ
Graceful shutdown — это корректное завершение работы приложения, позволяющее завершить все текущие операции, освободить ресурсы и корректно закрыть соединения перед выходом. В Go реализуется через обработку сигналов (SIGINT, SIGTERM) и использование контекста.
Пример:
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
server := &http.Server{Addr: ":8080"}
go func() {
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal(err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
shutdownCtx, shutdownCancel := context.WithTimeout(ctx, 5*time.Second)
defer shutdownCancel()
if err := server.Shutdown(shutdownCtx); err != nil {
log.Fatal("Forced shutdown:", err)
}
}
Ключевые моменты:
- Ожидание сигналов завершения
- Завершение работы с таймаутом
- Освобождение ресурсов (БД, соединения и т.д.)