Sobes.tech
Назад к вопросам
Senior
7

Что такое Graceful Shutdown и зачем он нужен?

Компании, где спрашивали
2gis2gis

Ответ от нейросети

sobes.tech AI

Graceful Shutdown — это корректное завершение работы приложения или сервиса, при котором оно завершает текущие задачи, освобождает ресурсы и не принимает новые запросы. Это нужно, чтобы избежать потери данных, неконсистентного состояния и обеспечить плавный переход при обновлениях или остановке.

В Go это обычно реализуется с помощью прослушивания сигналов ОС (например, SIGINT, SIGTERM) и последующего вызова функций завершения:

import (
    "context"
    "log"
    "net/http"
    "os"
    "os/signal"
    "time"
)

func main() {
    srv := &http.Server{Addr: ":8080"}

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

    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()
    if err := srv.Shutdown(ctx); err != nil {
        log.Fatalf("Server Shutdown: %v", err)
    }
    log.Println("Server exiting")
}

Такой подход позволяет завершить обработку текущих запросов и корректно остановить сервер.