Sobes.tech
Middle — Middle+

Чӣ гуна бояд системаро бехатарона ба таври дуруст қатъ кард, бе аз даст додани маълумот ва бо камтарин вақти бекорӣ?

sobes.tech AI

Ҷавоб аз 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")
}

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