Sobes.tech
Back to questions
Senior
3

How should an HTTP server in Go be designed to support graceful shutdown and proper resource cleanup?

Companies where asked
AndersenAndersen

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")

Такой подход гарантирует, что сервер не прервет активные соединения, а корректно завершит их, освободит ресурсы и завершит работу.