Middle — Middle+
Comment réaliser correctement une fermeture sécurisée du système sans perte de données et avec un temps d'arrêt minimal?
sobes.tech IA
Réponse de l'IA
Для безопасного завершения работы системы на 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")
}
Такой подход позволяет корректно завершить работу, дождаться завершения текущих запросов и избежать потери данных.