Sobes.tech
Middle — Middle+

Jaký je postupný sled kroků potřebný k správnému zastavení aplikace bez ztráty dat nebo selhání?

sobes.tech AI

Odpověď od AI

Pro správné ukončení aplikace Go bez ztráty dat a chyb je obvykle třeba provést následující kroky:

  1. Zpracování signálů operačního systému — zachytávání signálů ukončení (SIGINT, SIGTERM) pomocí kanálu a signal.Notify.

  2. Zahájení plynulého ukončení (graceful shutdown) — spuštění procedury plynulého ukončení, která zastaví přijímání nových požadavků a umožní dokončení stávajících.

  3. Zrušení kontextu — použití context.Context s zrušením k přenosu signálu ukončení všem gorutinám.

  4. Uzavření zdrojů — uzavření otevřených spojení s databázemi, soubory, síťovými připojeními.

  5. Čekání na dokončení gorutin — pomocí sync.WaitGroup nebo jiných mechanismů čekají, až všechny operace skončí.

Příklad zpracování signálu a plynulého ukončení:

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

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

    // Spuštění aplikace
    wg.Add(1)
    go func() {
        defer wg.Done()
        runApp(ctx) // hlavní logika
    }()

    // Zpracování signálů
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    <-sigs // čekání na signál
    cancel() // zrušení kontextu, signalizace gorutinám

    // Čekání na dokončení
    done := make(chan struct{})
    go func() {
        wg.Wait()
        close(done)
    }()

    select {
    case <-done:
        // vše dokončeno
    case <-time.After(10 * time.Second):
        // timeout
    }
}

Tento přístup pomáhá předcházet ztrátě dat a nesprávnému ukončení.