Middle — Middle+
Kako implementiraš nežno zaustavljanje usluge ili aplikacije radi očuvanja trenutnog stanja i završetka rada bez gubitka podataka?
sobes.tech АИ
Одговор од АИ
Za implementaciju meke zaustavljanja usluge ili aplikacije u Go obično se koristi obrada signala operativnog sistema (npr. SIGINT, SIGTERM) i kontekst sa otkazivanjem (context.Context). Ovo omogućava pravilno završavanje trenutnih operacija, čuvanje stanja i oslobađanje resursa.
Primer:
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// Obrada signala za meko zaustavljanje
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("Primljen signal za zaustavljanje, započinjemo zatvaranje...")
cancel() // Otkaži kontekst
}()
// Pokretanje glavne logike sa podrškom za otkazivanje
run(ctx)
}
func run(ctx context.Context) {
for {
select {
case <-ctx.Done():
// Sačuvaj stanje, oslobodi resurse
fmt.Println("Čuvanje stanja i zatvaranje")
time.Sleep(2 * time.Second) // simulacija
return
default:
// Glavni posao
fmt.Println("Radi...")
time.Sleep(1 * time.Second)
}
}
}
Ovaj pristup omogućava pravilno završavanje rada, bez gubitka podataka i bez nasilnog prekida operacija.