🟡 Средний · 2 очк. Разное / продвинутое
Как правильно реализовать graceful shutdown HTTP-сервера в Go?
A os.Exit(0)
B server.Close()
C Перехват сигнала (SIGTERM) + server.Shutdown(ctx)
D panic("shutdown")
Объяснение вопроса

Корректный порядок: перехватить сигнал завершения (SIGINT/SIGTERM), вызвать server.Shutdown(ctx) с context с таймаутом. Shutdown перестаёт принимать новые соединения и ждёт завершения активных запросов; по истечении ctx соединения обрываются.

ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
srv := &http.Server{Addr: ":8080", Handler: mux}
go srv.ListenAndServe()
<-ctx.Done()
shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
srv.Shutdown(shutdownCtx)

Close() сразу обрывает все соединения; Shutdown даёт время дообработать запросы.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.