Sobes.tech
Senior

Jak by měl být navržen HTTP server v Go tak, aby podporoval plynulé ukončení a správné čištění zdrojů?

sobes.tech AI

Odpověď od AI

Pro podporu plynulého ukončení (graceful shutdown) HTTP serveru v Go je třeba použít kontext s zrušením a metodu Shutdown z balíčku net/http. To umožňuje správně dokončit aktuální požadavky a uvolnit zdroje před zastavením serveru.

Příklad:

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

// Spuštění serveru v samostatné gorutině
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Čekání na signál ukončení
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Vytvoření kontextu s časovým limitem pro ukončení
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Zavolání Shutdown pro plynulé ukončení
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Server byl správně ukončen")

Tento přístup zajišťuje, že server neukončí aktivní spojení, ale je správně ukončí, uvolní zdroje a ukončí svou činnost.