Sobes.tech
Senior

Как да реализираме graceful shutdown? Как да разберем кога е време за graceful shutdown?

sobes.tech AI

Отговор от AI

Грациозното изключване (graceful shutdown) е правилното завършване на приложението, при което то успява да завърши текущите операции, да освободи ресурсите и правилно да затвори връзките.

В Go това обикновено се реализира чрез прихващане на системни сигнали (например SIGINT, SIGTERM) с помощта на пакета os/signal. Когато приложението получи сигнал за прекратяване, започва процесът на грациозно изключване.

Пример:

import (
    "context"
    "fmt"
    "net/http"
    "os"
    "os/signal"
    "syscall"
    "time"
)

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

    // Канал за сигнали
    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-quit
        fmt.Println("Затваряне на сървъра...")

        ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
        defer cancel()

        if err := srv.Shutdown(ctx); err != nil {
            fmt.Println("Сървърът беше принудително затворен:", err)
        }
    }()

    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
        fmt.Println("Грешка на сървъра:", err)
    }

    fmt.Println("Сървърът беше правилно затворен")
}

Разбирането кога е време за грациозно изключване може да се базира на сигнали от операционната система или вътрешни събития (например команда от администратора, превишаване на лимити, грешки). Обикновено това се открива чрез външни сигнали за прекратяване на процеса.