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.
- 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.
- Go’da
server.Shutdown(ctx)kullan.signal.NotifyContextile 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’ikill -9ile değil bu yolla sonlandır. - 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ındaqueue:work,kill -9atmadığın sürece SIGTERM’i kendisi ele alır — çalışan job’ı bitirir, yeni job claim etmez. - Platformun grace süresini drain’inle hizala. ASG’de lifecycle hook, k8s’te
terminationGracePeriodSecondsile 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. - 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
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.