Sobes.tech
Middle — Middle+

Məlumatların itirilməsi və ya nasazlıqlar olmadan tətbiqi düzgün şəkildə dayandırmaq üçün hansı hərəkətlər ardıcıllığı tələb olunur?

sobes.tech Süni İntellekt

AI-dan cavab

Go tətbiqini düzgün şəkildə dayandırmaq üçün, məlumat itkisi və səhvlər olmadan, adətən aşağıdakı addımlar yerinə yetirilir:

  1. Əməliyyat sisteminin siqnallarını idarə etmək — bağlanma siqnallarını (SIGINT, SIGTERM) kanal və signal.Notify istifadə edərək tuturlar.

  2. Graceful shutdown başlatmaq — yeni sorğuları qəbul etməyi dayandıran və mövcud olanların tamamlanmasına imkan verən yumşaq bağlanma prosedurunu başlatırlar.

  3. Kontekstin ləğv edilməsicontext.Context ilə ləğv etmə istifadə edərək, dayandırma siqnalını bütün goroutine-lərə ötürürlər.

  4. Resursları bağlamaq — açıq olan verilənlər bazası əlaqələrini, faylları, şəbəkə əlaqələrini bağlayırlar.

  5. Goroutine-lərin tamamlanmasını gözləməksync.WaitGroup və ya digər mexanizmlər vasitəsilə bütün əməliyyatların tamamlanmasını gözləyirlər.

Siqnal və graceful shutdown nümunəsi:

import (
    "context"
    "os"
    "os/signal"
    "sync"
    "syscall"
    "time"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup

    // Tətbiqin başlaması
    wg.Add(1)
    go func() {
        defer wg.Done()
        runApp(ctx) // əsas məntiq funksiyası
    }()

    // Siqnalın idarə olunması
    sigs := make(chan os.Signal, 1)
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    <-sigs // siqnalı gözləyir
    cancel() // konteksti ləğv edir, goroutine-lərə siqnal verir

    // Tamamlanmasını gözləyir
    done := make(chan struct{})
    go func() {
        wg.Wait()
        close(done)
    }()

    select {
    case <-done:
        // hər şey tamamlandı
    case <-time.After(10 * time.Second):
        // vaxt bitdi
    }
}

Bu yanaşma məlumat itkisini və düzgün olmayan bağlanmanı qarşısını almağa kömək edir.