Graceful shutdown HTTP-сервера
Просто убить процесс — плохо: запросы в полёте оборвутся, транзакции не докатятся. Правильный способ — поймать сигнал ОС и вызвать Shutdown.
srv := &http.Server{Addr: ":8080"}
go srv.ListenAndServe()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGTERM, syscall.SIGINT)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
srv.Shutdown(ctx)Shutdown перестаёт принимать новые соединения, но ждёт завершения активных — в пределах таймаута из контекста. Ровно тот случай, где context из раннего поста работает по назначению.
В контейнерах это критично: оркестратор шлёт SIGTERM перед остановкой пода, и корректный shutdown избавляет от оборванных запросов при выкатке.