Senior
Как да реализираме graceful shutdown? Как да разберем кога е време за graceful shutdown?
sobes.tech AI
Отговор от AI
Грациозното изключване (graceful shutdown) е правилното завършване на приложението, при което то успява да завърши текущите операции, да освободи ресурсите и правилно да затвори връзките.
В Go това обикновено се реализира чрез прихващане на системни сигнали (например SIGINT, SIGTERM) с помощта на пакета os/signal. Когато приложението получи сигнал за прекратяване, започва процесът на грациозно изключване.
Пример:
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
srv := &http.Server{Addr: ":8080"}
// Канал за сигнали
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-quit
fmt.Println("Затваряне на сървъра...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
fmt.Println("Сървърът беше принудително затворен:", err)
}
}()
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
fmt.Println("Грешка на сървъра:", err)
}
fmt.Println("Сървърът беше правилно затворен")
}
Разбирането кога е време за грациозно изключване може да се базира на сигнали от операционната система или вътрешни събития (например команда от администратора, превишаване на лимити, грешки). Обикновено това се открива чрез външни сигнали за прекратяване на процеса.