Sobes.tech
Middle — Middle+

Hoe implementeer je een zachte stop van de service of applicatie om de huidige staat op te slaan en zonder gegevensverlies af te sluiten?

sobes.tech AI

Antwoord van AI

Om een zachte stop van een service of applicatie in Go te implementeren, wordt meestal gebruik gemaakt van het afhandelen van systeemsignalen (bijvoorbeeld SIGINT, SIGTERM) en een context met annulering (context.Context). Dit stelt je in staat om lopende operaties correct af te ronden, de staat op te slaan en bronnen vrij te geven.

Voorbeeld:

package main

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

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

    // Signaalafhandeling voor een zachte stop
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Signaal voor stop ontvangen, start afsluiting...")
        cancel() // Annuleer de context
    }()

    // Voer de hoofdlogica uit met ondersteuning voor annulering
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Sla de staat op, vrij resources
            fmt.Println("Staat opslaan en afsluiten")
            time.Sleep(2 * time.Second) // simulatie
            return
        default:
            // Hoofdtaken
            fmt.Println("Bezig...")
            time.Sleep(1 * time.Second)
        }
    }
}

Deze aanpak maakt het mogelijk om de werkzaamheden correct af te ronden, zonder gegevens te verliezen en zonder operaties geforceerd te onderbreken.