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:
-
Zpracování signálů operačního systému — zachytávání signálů ukončení (
SIGINT,SIGTERM) pomocí kanálu asignal.Notify. -
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.
-
Zrušení kontextu — použití
context.Contexts zrušením k přenosu signálu ukončení všem gorutinám. -
Uzavření zdrojů — uzavření otevřených spojení s databázemi, soubory, síťovými připojeními.
-
Čekání na dokončení gorutin — pomocí
sync.WaitGroupnebo 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í.