Sobes.tech
Senior

Ako by mal byť navrhnutý HTTP server v Go na podporu plynulého ukončenia a správneho čistenia zdrojov?

sobes.tech AI

Odpoveď od AI

Na podporu plynulého ukončenia (graceful shutdown) HTTP servera v Go je potrebné použiť kontext s zrušením a metódu Shutdown z balíka net/http. To umožňuje správne dokončenie aktuálnych požiadaviek a uvoľnenie zdrojov pred zastavením servera.

Príklad:

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

// Spustenie servera v samostatnej goroutine
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

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

// Vytvorenie kontextu s časovým limitom pre ukončenie
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Zavolanie Shutdown pre plynulé ukončenie
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%v", err)
}

log.Println("Server bol správne ukončený")

Tento prístup zabezpečuje, že server neukončí aktívne spojenia, ale ich správne ukončí, uvoľní zdroje a ukončí svoju činnosť.