Middle — Middle+
Hoe implementeer je correct een veilige afsluiting van het systeem zonder gegevensverlies en met minimale stilstandtijd?
sobes.tech AI
Antwoord van 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")
}
Такой подход позволяет корректно завершить работу, дождаться завершения текущих запросов и избежать потери данных.