Sobes.tech
Senior

Kā īstenot glītu slēgšanu? Kā saprast, kad ir pienācis laiks veikt glītu slēgšanu?

sobes.tech AI

Atbilde no AI

Maiga izslēgšana (graceful shutdown) ir pareiza programmas noslēgšana, kurā tā spēj pabeigt pašreizējās operācijas, atbrīvot resursus un pareizi aizvērt savienojumus.

Go valodā tas parasti tiek īstenots, noķerot sistēmas signālus (piemēram, SIGINT, SIGTERM) ar os/signal paketi. Kad programma saņem izbeigšanas signālu, tā sāk maigas izslēgšanas procesu.

Piemērs:

import (
    "context"
    "fmt"
    "net/http"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    srv := &http.Server{Addr: ":8080"}

    // Signālu kanāls
    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-quit
        fmt.Println("Serveris tiek slēgts...")

        ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
        defer cancel()

        if err := srv.Shutdown(ctx); err != nil {
            fmt.Println("Serveris tika piespiedu kārtā slēgts:", err)
        }
    }()

    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
        fmt.Println("Servera kļūda:", err)
    }

    fmt.Println("Serveris tika pareizi slēgts")
}

Saprotot, kad ir laiks veikt maigu izslēgšanu, tas parasti balstās uz operētājsistēmas signāliem vai iekšējiem notikumiem (piemēram, administratora komanda, limitu pārsniegšana, kļūdas). Parasti tas tiek noteikts, saņemot ārējos signālus procesa pārtraukšanai.