Sobes.tech
Senior

Kako treba da bude dizajniran HTTP server u Go-u da podrži glatko gašenje i pravilno čišćenje resursa?

sobes.tech АИ

Одговор од АИ

Za podršku glatkom zaustavljanju (graceful shutdown) HTTP servera u Go, potrebno je koristiti kontekst sa otkazivanjem i metodu Shutdown iz paketa net/http. Ovo omogućava pravilno završavanje trenutnih zahteva i oslobađanje resursa pre zaustavljanja servera.

Primer:

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

// Pokretanje servera u posebnoj gorutini
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Čekanje na signal za prekid
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Kreiranje konteksta sa vremenskim ograničenjem za gašenje
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Pozivanje Shutdown za glatko gašenje
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Server je pravilno ugašen")

Ovaj pristup garantuje da server neće prekinuti aktivne konekcije, već će ih pravilno zatvoriti, osloboditi resurse i zaustaviti rad.