Üçü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 sizi kurtarmaz — onu agresif bir timeout ile birlikte kurarsanız kurtarır. Çünkü worker’larınızı öldüren şey hatanın kendisi değil, o hataya kadar geçen 30 saniyelik bekleme.
Yaşadığınız ş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 kurun.
CLOSED: çağrılar geçer, hatalar sayılır. Eşik aşılıncaOPEN’a geçin: bağımlılığı hiç çağırmayın, anında fallback dönün ve bir süre (cooldown) böyle kalın. Cooldown bitinceHALF-OPEN: birkaç deneme isteğini içeri alın — başarılıysaCLOSED’a dönün, yine hata varsa tekrarOPEN’a geçin. Mantığın kalbi bu. - Önce timeout’u kısın, asıl katil o.
connect_timeoutvetimeout’u saniyeler değil, milisaniyeler seviyesinde tutun (örn. 800ms-2s). Kısa timeout olmadan breaker işe yaramaz; ikisini birlikte ayarlayın yoksa havuz yine dolar. - Bulkhead ile o bağımlılığı izole edin. Kargo API’ye aynı anda gidebilecek istek sayısını sınırlayın. Böylece o servis yavaşladığında tüm worker’larınızı değil, sadece ona ayrılmış küçük bir dilimi tüketir; çekirdek akış (sepet, ödeme) ayakta kalır.
- Fallback’i önceden tanımlayın. Son cache’lenmiş kargo fiyatını dönün, olmuyorsa “tahmini ücret şu an hesaplanamıyor” deyin. Kullanıcıya hata sayfası göstermek yerine bozulmuş ama çalışan bir deneyim sunun.
- Aracı doğru seçin. Laravel’de Guzzle client’ını bir middleware’e sarın, durumu Redis’te tutun. Go’da elle yazmayın —
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ın, sonra breaker’ı ekleyin.
İlgili Yazılar
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.