Sobes.tech
Middle — Middle+

Comment implémentes-tu un arrêt en douceur du service ou de l'application pour sauvegarder l'état actuel et terminer sans perte de données?

sobes.tech IA

Réponse de l'IA

Pour implémenter un arrêt en douceur d’un service ou d’une application en Go, on utilise généralement la gestion des signaux du système d’exploitation (par exemple, SIGINT, SIGTERM) et un contexte avec annulation (context.Context). Cela permet de terminer proprement les opérations en cours, de sauvegarder l’état et de libérer les ressources.

Exemple :

package main

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

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

    // Gestion des signaux pour un arrêt en douceur
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Signal d’arrêt reçu, début de la fermeture...")
        cancel() // Annuler le contexte
    }()

    // Lancer la logique principale avec support de l’annulation
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Sauvegarder l’état, libérer les ressources
            fmt.Println("Sauvegarde de l’état et fermeture")
            time.Sleep(2 * time.Second) // simulation
            return
        default:
            // Travail principal
            fmt.Println("Travail en cours...")
            time.Sleep(1 * time.Second)
        }
    }
}

Cette approche permet de terminer proprement le travail, sans perdre de données ni interrompre brutalement les opérations.