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

Как реализовать graceful shutdown? Как понять что пора делать graceful shutdown?

Компании, где спрашивали
Гос крипта

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

sobes.tech AI

Graceful shutdown — это корректное завершение работы приложения, при котором оно успевает завершить текущие операции, освободить ресурсы и корректно закрыть соединения.

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

Пример:

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("Shutting down server...")

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

        if err := srv.Shutdown(ctx); err != nil {
            fmt.Println("Server forced to shutdown:", err)
        }
    }()

    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
        fmt.Println("Server error:", err)
    }

    fmt.Println("Server exited properly")
}

Понять, что пора делать graceful shutdown, можно по сигналам ОС или внутренним событиям (например, команда от администратора, превышение лимитов, ошибки). Обычно это внешние сигналы завершения процесса.