Sobes.tech
Senior

Come dovrebbe essere progettato un server HTTP in Go per supportare uno shutdown graduale e una corretta pulizia delle risorse?

sobes.tech AI

Risposta dell'AI

Per supportare uno shutdown ordinato di un server HTTP in Go, è necessario utilizzare un contesto con cancellazione e il metodo Shutdown del pacchetto net/http. Questo permette di terminare correttamente l'elaborazione delle richieste in corso e di liberare le risorse prima di fermare il server.

Esempio:

srv := &http.Server{Addr: ":8080", Handler: myHandler}

// Avviare il server in una goroutine
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Attendere il segnale di terminazione
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Creare un contesto con timeout per lo shutdown
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Chiamare Shutdown per uno shutdown ordinato
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Server spento correttamente")

Questo approccio garantisce che il server non interrompa le connessioni attive, ma le termini correttamente, liberi le risorse e si spenga.