Middle — Middle+
Veri kaybı olmadan ve minimum kesinti süresiyle sistemin güvenli bir şekilde nasıl düzgün bir şekilde kapatılır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Для безопасного завершения работы системы на 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")
}
Такой подход позволяет корректно завершить работу, дождаться завершения текущих запросов и избежать потери данных.