Sobes.tech
Middle — Middle+

Hogyan valósítod meg az alkalmazás vagy szolgáltatás lágy leállítását, hogy megőrizze a jelenlegi állapotot és adatvesztés nélkül fejezze be a működést?

sobes.tech MI

Válasz az MI-től

A Go nyelvű szolgáltatás vagy alkalmazás finom leállításának megvalósításához általában az operációs rendszer jeleinek (például SIGINT, SIGTERM) kezelését és egy megszakítható kontextus (context.Context) használatát alkalmazzuk. Ez lehetővé teszi a folyamatban lévő műveletek helyes befejezését, az állapot mentését és az erőforrások felszabadítását.

Példa:

package main

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

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    // Jelzések kezelése a finom leállításhoz
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Leállási jelzés érkezett, a lezárás megkezdődik...")
        cancel() // Kontextus megszakítása
    }()

    // Fő logika futtatása támogatással a megszakításra
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Állapot mentése, erőforrások felszabadítása
            fmt.Println("Állapot mentése és bezárás")
            time.Sleep(2 * time.Second) // szimuláció
            return
        default:
            // Fő munka
            fmt.Println("Dolgozik...")
            time.Sleep(1 * time.Second)
        }
    }
}

Ez a megközelítés lehetővé teszi a munka helyes befejezését, adatvesztés nélkül és a műveletek erőszakos megszakítása nélkül.