Aký je potrebný sled krokov na správne zastavenie aplikácie bez straty dát alebo chýb?
sobes.tech AI
Odpoveď od AI
Za pravilno zaustavljanje Go aplikacije bez gubitka podataka i grešaka, obično se slede sledeći koraci:
-
Obrada signala operativnog sistema — hvatanje signala za završetak (
SIGINT,SIGTERM) pomoću kanala isignal.Notify. -
Pokretanje graceful shutdown — pokreće se procedura za glatko zatvaranje, koja zaustavlja prihvatanje novih zahteva i dozvoljava da se postojeći završe.
-
Otkaži kontekst — koristeći
context.Contextsa otkazivanjem, prenosi se signal za zaustavljanje svim gorutinama. -
Zatvaranje resursa — zatvaraju se otvorene veze sa bazama podataka, fajlovima, mrežnim vezama.
-
Čekanje da sve goroutine završe — pomoću
sync.WaitGroupili drugih mehanizama, čeka se da sve operacije završe.
Primer obrade signala i graceful shutdown:
import (
"context"
"os"
"os/signal"
"sync"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
var wg sync.WaitGroup
// Pokretanje aplikacije
wg.Add(1)
go func() {
defer wg.Done()
runApp(ctx) // glavna logika
}()
// Obrada signala
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
<-sigs // čekanje na signal
cancel() // otkazivanje konteksta, signal goroutine-ima
// Čekanje da sve završi
done := make(chan struct{})
go func() {
wg.Wait()
close(done)
}()
select {
case <-done:
// sve završeno
case <-time.After(10 * time.Second):
// timeout
}
}
Ovaj pristup pomaže da se izbegne gubitak podataka i nepravilno zatvaranje.