Sobes.tech
Senior

Cum ar trebui proiectat un server HTTP în Go pentru a suporta o oprire grațioasă și o curățare adecvată a resurselor?

sobes.tech AI

Răspuns de la AI

Pentru a suporta o oprire grațioasă a unui server HTTP în Go, trebuie să folosiți un context cu anulare și metoda Shutdown din pachetul net/http. Acest lucru permite finalizarea corectă a procesării cererilor curente și eliberarea resurselor înainte de oprirea serverului.

Exemplu:

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

// Pornirea serverului într-o goroutine separată
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Așteptarea semnalului de închidere
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Crearea unui context cu timeout pentru oprire
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Apelarea Shutdown pentru oprire grațioasă
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Serverul s-a închis corect")

Această abordare garantează că serverul nu va întrerupe conexiunile active, ci le va închide corect, va elibera resursele și se va opri.