Назад к вопросам
Middle — Middle+
78
Каким образом правильно реализовать безопасное завершение работы системы без потери данных и с минимальным временем простоя?
Компании, где спрашивали
IDT
Ответ от нейросети
sobes.tech AI
Для безопасного завершения работы системы на Go без потери данных и с минимальным временем простоя обычно используют следующие подходы:
-
Обработка сигналов ОС (например, SIGINT, SIGTERM) с помощью пакета
os/signal. Это позволяет корректно отследить запрос на остановку. -
Контекст (context.Context) для управления временем жизни горутин и отмены операций.
-
Graceful shutdown — последовательное завершение работы:
- Остановить приём новых запросов (например, закрыть HTTP сервер).
- Дождаться завершения текущих операций.
- Сохранить состояние и освободить ресурсы.
Пример:
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")
}
Такой подход позволяет корректно завершить работу, дождаться завершения текущих запросов и избежать потери данных.