Middle — Middle+
Hogyan valósítod meg az alkalmazás vagy szolgáltatás lágy leállítását, hogy megőrizze a jelenlegi állapotot és adatvesztés nélkül fejezze be a működést?
sobes.tech MI
Válasz az MI-től
A Go nyelvű szolgáltatás vagy alkalmazás finom leállításának megvalósításához általában az operációs rendszer jeleinek (például SIGINT, SIGTERM) kezelését és egy megszakítható kontextus (context.Context) használatát alkalmazzuk. Ez lehetővé teszi a folyamatban lévő műveletek helyes befejezését, az állapot mentését és az erőforrások felszabadítását.
Példa:
package main
import (
"context"
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// Jelzések kezelése a finom leállításhoz
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
fmt.Println("Leállási jelzés érkezett, a lezárás megkezdődik...")
cancel() // Kontextus megszakítása
}()
// Fő logika futtatása támogatással a megszakításra
run(ctx)
}
func run(ctx context.Context) {
for {
select {
case <-ctx.Done():
// Állapot mentése, erőforrások felszabadítása
fmt.Println("Állapot mentése és bezárás")
time.Sleep(2 * time.Second) // szimuláció
return
default:
// Fő munka
fmt.Println("Dolgozik...")
time.Sleep(1 * time.Second)
}
}
}
Ez a megközelítés lehetővé teszi a munka helyes befejezését, adatvesztés nélkül és a műveletek erőszakos megszakítása nélkül.