Sobes.tech
Senior

Hogyan kell egy Go-ban írt HTTP szervert tervezni, hogy támogassa a zökkenőmentes leállást és a megfelelő erőforrás-eltávolítást?

sobes.tech MI

Válasz az MI-től

A Go nyelvű HTTP szervereknél a zökkenőmentes leállás támogatásához használjon lemondással ellátott kontextust és a net/http csomag Shutdown metódusát. Ez lehetővé teszi a jelenlegi kérések helyes befejezését és az erőforrások felszabadítását a szerver leállítása előtt.

Példa:

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

// A szerver indítása külön goroutine-ban
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// A leállási jelzés várása
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Kontextus létrehozása időkorláttal a leálláshoz
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// A Shutdown meghívása a zökkenőmentes leállításhoz
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("A szerver megfelelően leállt")

Ez a megközelítés biztosítja, hogy a szerver ne szakítsa meg az aktív kapcsolatokat, hanem azokat helyesen zárja le, felszabadítja az erőforrásokat és leáll.