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

Üçüncü parti API bağımlılığında Circuit Breaker'ı nasıl kurarım?


Soru

Uygulamamız kargo fiyatını harici bir kargo API'ından çekiyor. Kargo firması yavaşlayınca ya da çökünce isteklerimiz timeout'a düşüyor, Octane/PHP-FPM worker'ları bloke oluyor ve tüm sistem kilitleniyor. Bu zincirleme çökmeyi önlemek için Circuit Breaker'ı Guzzle middleware veya Go kütüphanesiyle nasıl kurarım? Devre Açık/Kapalı/Yarı-Açık durumlarında sistem nasıl davranmalı?

Cevap

Kısa cevap: Circuit breaker tek başına seni kurtarmaz — onu agresif bir timeout ile birlikte kurarsan kurtarır. Çünkü worker’larını öldüren şey hatanın kendisi değil, o hataya kadar geçen 30 saniyelik bekleme.

Yaşadığın şey klasik zincirleme çökme (cascading failure): yavaş bir bağımlılık, her isteği timeout’a kadar bekletir, havuz dolar, sistem kilitlenir. Breaker’ın işi, çöken bir bağımlılığı çağırmayı tamamen kesmek.

  1. Üç durumu doğru kur. CLOSED: çağrılar geçer, hatalar sayılır. Eşik aşılınca OPEN’a geç: bağımlılığı hiç çağırma, anında fallback dön ve bir süre (cooldown) böyle kal. Cooldown bitince HALF-OPEN: birkaç deneme isteğini içeri al — başarılıysa CLOSED’a dön, yine hata varsa tekrar OPEN’a geç. Mantığın kalbi bu.
  2. Önce timeout’u kıs, asıl katil o. connect_timeout ve timeout’u saniyeler değil, milisaniyeler seviyesinde tut (örn. 800ms-2s). Kısa timeout olmadan breaker işe yaramaz; ikisini birlikte ayarla yoksa havuz yine dolar.
  3. Bulkhead ile o bağımlılığı izole et. Kargo API’ına aynı anda gidebilecek istek sayısını sınırla. Böylece o servis yavaşladığında tüm worker’larını değil, sadece ona ayrılmış küçük bir dilimi tüketir; çekirdek akış (sepet, ödeme) ayakta kalır.
  4. Fallback’i önceden tanımla. Son cache’lenmiş kargo fiyatını dön, olmuyorsa “tahmini ücret şu an hesaplanamıyor” de. Kullanıcıya hata sayfası göstermek yerine bozulmuş ama çalışan bir deneyim sun.
  5. Aracı doğru seç. Laravel’de Guzzle client’ını bir middleware’e sar, durumu Redis’te tut. Go’da elle yazma — sony/gobreaker zaten bu üç durumu veriyor.

Sonuç: Ben olsam breaker’ı asla yalnız bırakmam: kısa timeout + bulkhead + cache’li fallback üçlüsüyle kurarım. Worker’ların timeout beklerken bloke olması özellikle kalıcı süreçli mimaride (Octane) çok daha sert vurur; o yüzden önce timeout’u kıs, sonra breaker’ı ekle.

İlgili Yazılar

Etiketler: #dayanıklılık#mimari#laravel
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