Sobes.tech
Senior

Go-da HTTP serveri necə dizayn edilməlidir ki, mərhəmətli dayandırma və düzgün resurs təmizləməsini dəstəkləsin?

sobes.tech Süni İntellekt

AI-dan cavab

Go-da HTTP serverinin düzgün şəkildə bağlanmasını dəstəkləmək üçün, ləğv etmə ilə kontekst və net/http paketindən Shutdown metodundan istifadə etmək lazımdır. Bu, mövcud sorğuların düzgün şəkildə tamamlanmasına və resursların sərbəst buraxılmasına imkan verir, server dayandırılmadan əvvəl.

Nümunə:

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

// Serveri ayrı gorutində işə salmaq
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// Dayanma siqnalını gözləmək
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// Dayanma üçün vaxt limiti olan kontekst yaratmaq
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Düzgün dayandırma üçün Shutdown çağırmaq
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("Server düzgün şəkildə bağlandı")

Bu yanaşma, serverin aktiv əlaqələri kəsməməsini təmin edir, onları düzgün şəkildə bağlayır, resursları sərbəst buraxır və işini dayandırır.