Üçü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.
- Üç durumu doğru kur.
CLOSED: çağrılar geçer, hatalar sayılır. Eşik aşılıncaOPEN’a geç: bağımlılığı hiç çağırma, anında fallback dön ve bir süre (cooldown) böyle kal. Cooldown bitinceHALF-OPEN: birkaç deneme isteğini içeri al — başarılıysaCLOSED’a dön, yine hata varsa tekrarOPEN’a geç. Mantığın kalbi bu. - Önce timeout’u kıs, asıl katil o.
connect_timeoutvetimeout’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. - 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.
- 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.
- Aracı doğru seç. Laravel’de Guzzle client’ını bir middleware’e sar, durumu Redis’te tut. Go’da elle yazma —
sony/gobreakerzaten 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
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.