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

Каким образом правильно реализовать безопасное завершение работы системы без потери данных и с минимальным временем простоя?

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

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

sobes.tech AI

Для безопасного завершения работы системы на Go без потери данных и с минимальным временем простоя обычно используют следующие подходы:

  • Обработка сигналов ОС (например, SIGINT, SIGTERM) с помощью пакета os/signal. Это позволяет корректно отследить запрос на остановку.

  • Контекст (context.Context) для управления временем жизни горутин и отмены операций.

  • Graceful shutdown — последовательное завершение работы:

    1. Остановить приём новых запросов (например, закрыть HTTP сервер).
    2. Дождаться завершения текущих операций.
    3. Сохранить состояние и освободить ресурсы.

Пример:

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 // Ждём сигнала

    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 Shutdown Failed:%+v", err)
    }

    log.Println("Server exited properly")
}

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