Sobes.tech
Назад к вопросам
Middle+
3

Что такое graceful shutdown и как он работает в Go?

Компании, где спрашивали
Веро Трейс

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

sobes.tech AI

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

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

  • Останавливает приём новых запросов.
  • Завершает обработку текущих запросов или задач.
  • Освобождает ресурсы (базы данных, файлы, соединения).
  • Завершает работу и выходит.

Пример реализации graceful shutdown в Go:

package main

import (
    "context"
    "log"
    "net/http"
    "os"
    "os/signal"
    "syscall"
    "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, syscall.SIGINT, syscall.SIGTERM)
    <-quit // ждем сигнала

    log.Println("Shutting down server...")

    // Создаем контекст с таймаутом для завершения работы
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    if err := srv.Shutdown(ctx); err != nil {
        log.Fatalf("Server forced to shutdown: %v", err)
    }

    log.Println("Server exiting")
}

Таким образом, приложение корректно завершает работу, не прерывая активные соединения и операции.