Sobes.tech
Middle — Middle+

Come implementi un arresto morbido del servizio o dell'applicazione per salvare lo stato attuale e terminare senza perdita di dati?

sobes.tech AI

Risposta dell'AI

Per implementare una fermata morbida di un servizio o applicazione in Go, si utilizzano generalmente la gestione dei segnali del sistema operativo (ad esempio, SIGINT, SIGTERM) e un contesto con cancellazione (context.Context). Questo permette di terminare correttamente le operazioni in corso, salvare lo stato e liberare le risorse.

Esempio:

package main

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

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

    // Gestione dei segnali per una fermata morbida
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("Segnale di stop ricevuto, inizio chiusura...")
        cancel() // Annulla il contesto
    }()

    // Eseguire la logica principale con supporto alla cancellazione
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Salva lo stato, libera le risorse
            fmt.Println("Salvataggio stato e chiusura")
            time.Sleep(2 * time.Second) // simulazione
            return
        default:
            // Lavoro principale
            fmt.Println("Lavorando...")
            time.Sleep(1 * time.Second)
        }
    }
}

Questo approccio permette di terminare correttamente il lavoro, senza perdere dati e senza interrompere le operazioni in modo forzato.