Sobes.tech
Middle — Middle+

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:

  1. Obrada signala operativnog sistema — hvatanje signala za završetak (SIGINT, SIGTERM) pomoću kanala i signal.Notify.

  2. Pokretanje graceful shutdown — pokreće se procedura za glatko zatvaranje, koja zaustavlja prihvatanje novih zahteva i dozvoljava da se postojeći završe.

  3. Otkaži kontekst — koristeći context.Context sa otkazivanjem, prenosi se signal za zaustavljanje svim gorutinama.

  4. Zatvaranje resursa — zatvaraju se otvorene veze sa bazama podataka, fajlovima, mrežnim vezama.

  5. Čekanje da sve goroutine završe — pomoću sync.WaitGroup ili 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.