Sobes.tech
Middle — Middle+

Care este secvența de acțiuni necesară pentru oprirea corectă a aplicației fără a pierde date sau a cauza erori?

sobes.tech AI

Răspuns de la AI

Pentru a opri corect o aplicație Go fără pierderi de date și erori, se urmează de obicei pașii următori:

  1. Gestionarea semnalelor sistemului de operare — capturarea semnalelor de terminare (SIGINT, SIGTERM) folosind un canal și signal.Notify.

  2. Inițierea unei opriri grațioase (graceful shutdown) — lansarea unei proceduri de închidere lină, care oprește acceptarea de noi solicitări și permite celor existente să se finalizeze.

  3. Anularea contextului — folosind context.Context cu anulare pentru a transmite semnalul de oprire tuturor goroutine-urilor.

  4. Închiderea resurselor — închiderea conexiunilor deschise la baze de date, fișiere, conexiuni de rețea.

  5. Așteptarea finalizării goroutine-urilor — folosind sync.WaitGroup sau alte mecanisme pentru a aștepta ca toate operațiunile să se termine.

Exemplu de gestionare a semnalului și shutdown grațios:

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

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup

    // Pornirea aplicației
    wg.Add(1)
    go func() {
        defer wg.Done()
        runApp(ctx) // funcție cu logica principală
    }()

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

    <-sigs // așteaptă semnalul
    cancel() // anulează contextul, semnalând goroutine-urilor

    // Așteaptă finalizarea
    done := make(chan struct{})
    go func() {
        wg.Wait()
        close(done)
    }()

    select {
    case <-done:
        // totul s-a terminat
    case <-time.After(10 * time.Second):
        // timeout
    }
}

Această abordare ajută la evitarea pierderii de date și a închiderii incorecte.