Sobes.tech
Middle — Middle+

Koja je potrebna sekvenca radnji za ispravno zaustavljanje aplikacije bez gubitka podataka ili kvara?

sobes.tech АИ

Одговор од АИ

Да бисте исправно зауставили апликацију у Го-у без губитка података и грешака, обично се следе следећи кораци:

  1. Обрада сигнала оперативног система — хватање сигнала за прекид (SIGINT, SIGTERM) помоћу канала и signal.Notify.

  2. Покретање грациозног затварања (graceful shutdown) — покреће се процедура за глатко затварање, која зауставља прихватање нових захтева и дозвољава да се тренутни заврше.

  3. Отказивање контекста — користећи context.Context са отказивањем, преноси се сигнал за заустављање свим горутинама.

  4. Затварање ресурса — затварају се отворене везе са базама података, датотекама, мрежним везама.

  5. Чекање да све горутине заврше — коришћењем 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):
        // време истекло
    }
}

Овај приступ помаже у избегавању губитка података и неправилног затварања.