Sobes.tech
Senior

როგორ უნდა იყოს დიზაინი HTTP სერვერი Go-ში, რათა მხარდაჭერილი იყოს გლუვი გამორთვა და შესაბამისი რესურსების სისუფთავე?

sobes.tech AI

პასუხი AI-სგან

Go-ის HTTP სერვერის გრეისფული შეჩერების მხარდაჭერისთვის, საჭიროა გამოიყენოთ გაუქმების კონტექსტი და net/http პაკეტიდან Shutdown მეთოდი. ეს საშუალებას აძლევს მიმდინარე მოთხოვნების სწორად დასრულებას და რესურსების გათავისუფლებას სერვერის გაჩერებამდე.

მაგალითი:

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

// სერვერის გაშვება ცალკე გორუტინში
go func() {
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatalf("ListenAndServe(): %v", err)
    }
}()

// დასრულების სიგნალის მოლოდინი
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit

// კონტექსტის შექმნა დროით შეზღუდვით
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// `Shutdown`-ის გამოძახება გრეისფული შეჩერებისთვის
if err := srv.Shutdown(ctx); err != nil {
    log.Fatalf("Server Shutdown Failed:%+v", err)
}

log.Println("სერვერი სწორად დახურულია")

ეს მიდგომა უზრუნველყოფს, რომ სერვერი არ გაწყვეტს აქტიურ კავშირებს, არამედ სწორად დაასრულებს მათ, გაათავისუფლებს რესურსებს და შეჩერდება.