Koja je potrebna sekvenca radnji za ispravno zaustavljanje aplikacije bez gubitka podataka ili kvara?
sobes.tech АИ
Одговор од АИ
Да бисте исправно зауставили апликацију у Го-у без губитка података и грешака, обично се следе следећи кораци:
-
Обрада сигнала оперативног система — хватање сигнала за прекид (
SIGINT,SIGTERM) помоћу канала иsignal.Notify. -
Покретање грациозног затварања (graceful shutdown) — покреће се процедура за глатко затварање, која зауставља прихватање нових захтева и дозвољава да се тренутни заврше.
-
Отказивање контекста — користећи
context.Contextса отказивањем, преноси се сигнал за заустављање свим горутинама. -
Затварање ресурса — затварају се отворене везе са базама података, датотекама, мрежним везама.
-
Чекање да све горутине заврше — коришћењем
sync.WaitGroupили других механизама, чека се да све операције заврше.
Пример обраде сигнала и грациозног затварања:
import (
"context"
"os"
"os/signal"
"sync"
"syscall"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
var wg sync.WaitGroup
// Покретање апликације
wg.Add(1)
go func() {
defer wg.Done()
runApp(ctx) // главна логика
}()
// Обрада сигнала
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
<-sigs // чека на сигнал
cancel() // отказивање контекста, сигнал горутинама
// Чекање да све заврши
done := make(chan struct{})
go func() {
wg.Wait()
close(done)
}()
select {
case <-done:
// све завршено
case <-time.After(10 * time.Second):
// време истекло
}
}
Овај приступ помаже у избегавању губитка података и неправилног затварања.