Back to questions
Andersen
Senior
3
How should an HTTP server in Go be designed to support graceful shutdown and proper resource cleanup?
Companies where asked
Answer from AI
sobes.tech AI
Для поддержки graceful shutdown в HTTP-сервере на Go нужно использовать контекст с отменой и метод Shutdown из пакета net/http. Это позволяет корректно завершить обработку текущих запросов и освободить ресурсы перед остановкой сервера.
Пример:
srv := &http.Server{Addr: ":8080", Handler: myHandler}
// Запуск сервера в отдельной горутине
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("ListenAndServe(): %v", err)
}
}()
// Ожидание сигнала завершения
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit
// Создаем контекст с таймаутом для завершения
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Вызываем Shutdown для graceful остановки
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server Shutdown Failed:%+v", err)
}
log.Println("Server exited properly")
Такой подход гарантирует, что сервер не прервет активные соединения, а корректно завершит их, освободит ресурсы и завершит работу.