İçeriğe geç
Muhammet Şafak
en
Soran: Ozan Cevaplandı:

Autoscaling scale-in sırasında SIGTERM ile graceful shutdown'ı nasıl sağlarım?


Soru

AWS'te CPU %70'i geçince Autoscaling yeni EC2 açıyor, %30'un altına düşünce bazılarını kapatıyor (scale-in). Sunucu kapanırken içeride işlenen uzun HTTP istekleri veya kuyruk job'ları yarıda kesiliyor ve tutarsızlık oluşuyor. Uygulamanın (Laravel Octane / Go) `SIGTERM`'i yakalayıp mevcut istekleri bitirerek ve yeni istek almayarak zarifçe kapanmasını nasıl sağlarım?

Cevap

Kısa cevap: Scale-in işleri yarıda kesiyor çünkü uygulama SIGTERM’de drain etmiyor — sürecin kapanış yaşam döngüsünü düzeltmen gerekiyor.

Asıl mesele autoscaling değil, kapanış protokolü: platform SIGTERM gönderdiğinde uygulaman ya hemen ölüyor ya da işini bitirmeden kesiliyor. Doğru sıra şu: önce trafiği kes, sonra mevcut işi bitir, en son öl.

  1. SIGTERM’i yakala ve yeni istek almayı durdur. İlk hamle, readiness probe’unu fail ettirmek veya kendini load balancer’dan deregister etmek; böylece LB sana yeni istek yönlendirmeyi keser. Mevcut bağlantıları henüz kapatma — sadece akışı durdur.
  2. Go’da server.Shutdown(ctx) kullan. signal.NotifyContext ile SIGTERM’i yakala, http.Server’a deadline’lı bir context ver: server.Shutdown(ctx). Bu yeni bağlantıları reddeder, açık istekleri timeout’a kadar bitirir. ListenAndServe’i kill -9 ile değil bu yolla sonlandır.
  3. Octane’de graceful stop/reload kullan. Octane sürecini octane:stop/graceful reload ile indir; worker’lar mevcut isteği bitirip yenisini almaz. Kuyruk tarafında queue:work, kill -9 atmadığın sürece SIGTERM’i kendisi ele alır — çalışan job’ı bitirir, yeni job claim etmez.
  4. Platformun grace süresini drain’inle hizala. ASG’de lifecycle hook, k8s’te terminationGracePeriodSeconds ile platformun “öldürmeden önce kaç saniye bekleyeceğini” en uzun kabul edilebilir drain süresine eşitle. Aksi halde platform SIGTERM’den sonra SIGKILL atıp drain’i yarıda keser.
  5. Uzun job’ları idempotent/resumable yap. Grace süresi yetmez ve süreç sert kapanırsa bile güvende olmak için uzun işleri tekrar çalıştırılabilir tasarla — her adım idempotent olsun, yarıda kalan job baştan veya kaldığı yerden güvenle dönsün.

Sonuç: Sıra önemli: önce LB’yi drain et, sonra yeni istek alımını kes, sonra mevcut işi bitir, en son öl. Go’da bunu server.Shutdown(ctx), Octane’de graceful reload + queue:work’ün doğal SIGTERM davranışı verir; platform tarafında grace süresini gerçek drain süresine hizala. Üstüne job’ları idempotent yaparsan sert kill bile veriyi bozmaz. Octane’in kalıcı süreç modelinin bu kapanış davranışını neden değiştirdiğini hub’daki yazıda daha ayrıntılı anlattım.

İlgili Yazılar

Etiketler: #performans#ölçekleme#go
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

Diğer Sorular

Tüm sorular

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi