Sobes.tech
Middle — Middle+

Cum implementezi o oprire linistită a serviciului sau aplicației pentru a salva starea actuală și a încheia fără pierderi de date?

sobes.tech AI

Răspuns de la AI

Pentru a implementa o oprire linistită a unui serviciu sau aplicație în Go, se utilizează de obicei gestionarea semnalelor sistemului de operare (de exemplu, SIGINT, SIGTERM) și un context cu anulare (context.Context). Acest lucru permite închiderea corectă a operațiunilor în curs, salvarea stării și eliberarea resurselor.

Exemplu:

package main

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

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

    // Gestionarea semnalelor pentru oprire linistită
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        <-sigs
        fmt.Println("S-a primit semnal de oprire, începem închiderea...")
        cancel() // Anulare context
    }()

    // Rulare logică principală cu suport pentru anulare
    run(ctx)
}

func run(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Salvare stare, eliberare resurse
            fmt.Println("Salvare stare și închidere")
            time.Sleep(2 * time.Second) // simulare
            return
        default:
            // Lucru principal
            fmt.Println("Lucrăm...")
            time.Sleep(1 * time.Second)
        }
    }
}

Această abordare permite închiderea corectă a muncii, fără pierderea datelor și fără a întrerupe forțat operațiile.