Circuit Breaker Pattern: Zincirleme Hataları Önleyen Dayanıklı Mikroservisler
Dağıtık sistemlerde zincirleme hataları önlemek için gerçek dünyadan Circuit Breaker pattern implementasyonu ve kanıtlanmış stratejiler
Bir payment servisi yavaş fail ettiğinde tüm platformu etkileyebilir. Her request timeout olmak için 30 saniye beklediğinde, 12 farklı serviste trafik sıkışması yaratır. Bu klasik zincirleme hata pattern'idir. Circuit Breaker pattern ile bu problemi nasıl çözdüğümüzü ve bu tür incident'ları çözerken resilience hakkında öğrendiklerimizi paylaşacağım.
Problem: Yavaş Olmak Ölü Olmaktan Kötü
Şunu hayal edin: Payment provider'ınızın API'si yavaş cevap vermeye başlıyor. Down değil, sadece normal 200ms yerine request başına 20-30 saniye alıyor. Servisiniz sadakatle bekliyor. Bu arada gelen request'ler birikiyor. Thread pool'lar tükeniyor. Memory consumption patlıyor. Sonunda sağlıklı servisiniz sağlıksız hale geliyor ve enfeksiyon upstream'e yayılıyor.
Bu pattern tüm platformları öldürebilir. En zorlu kısmı? Monitoring'iniz tüm servislerin "up" olduğunu gösteriyor - sadece cevap vermiyorlar. Health check'ler geçer ama request'ler timeout'a düşer.
Circuit Breaker: Sisteminizin Güvenlik Valfi
Circuit Breaker pattern evinizdeki elektrik sigortası gibi çalışır. İşler ters gittiğinde atar, hasarın yayılmasını önler. Ama evinizdeki sigortadan farklı olarak bu akıllı - problemin düzelip düzelmediğini test edebilir ve otomatik olarak recover edebilir. Opsiyonel half-open state sayesinde servis iyileştiğinde akış yeniden başlar.
Üç State
Bir kulüpteki bouncer gibi düşünün:
- CLOSED: "Gelin, her şey yolunda"
- OPEN: "Kimse giremiyor, içeride problem var"
- HALF_OPEN: "Bir kişiyle kontrol edeyim güvenli mi"
Gerçek Implementasyon: Gerçekten İşe Yarayan
İşte bu zorlukları ele alan bir circuit breaker implementasyonu. Bu pattern yüksek request hacmi olan servislerde güvenilir olduğunu kanıtlamıştır:
Production'dan Dersler: Tutorial'ların Söylemediği Şeyler
1. Timeout En Önemli Setting'iniz
Incident pattern analizleri gösteriyor ki çoğu hata (yaklaşık %70) complete failure'lardan değil yavaş response'lardan kaynaklanıyor. Timeout'unuzu agresif ayarlamak yardımcı oluyor:
Bir payment servisinden örnek timing:
- Normal P50: 180ms
- Normal P99: 1.2s
- Circuit breaker timeout: 3s
- Sonuç: Zincirleme hatalarda önemli azalma
2. Half-Open State Tuzağı
Başlarda half-open'a geçer, bir request gönderir, başarılı olur, circuit'i kapatır, sonra full traffic ile hemen tekrar fail ederdik. Çözüm: kapanmadan önce birden fazla success iste.
3. Retry Logic ile Kombine Et (Ama Dikkatli)
Circuit breaker'lar ve retry'lar feedback loop yaratabilir. Güvenilir bir kombinasyon:
4. Doğru Metrik'leri Monitor Et
Neyi track etmeli (önem sırasına göre):
- Circuit state değişiklikleri - OPEN'da hemen alert
- Reset attempt sonuçları - Failed reset'ler = devam eden problem
- Request rejection rate - Business impact metriği
- OPEN state'te geçen süre - Reset timeout'u ayarlamaya yardımcı
CloudWatch dashboard'umuz:
İleri Seviye Pattern'ler: Basic Circuit Breaking'in Ötesinde
Bulkheading: İzole Circuit Breaker'lar
Tüm servis için tek circuit breaker kullanma. Kritik path'leri izole et:
Bu pattern yoğun trafik dönemlerinde bir endpoint overwhelm olduğunda diğerlerinin çalışmaya devam etmesini sağlar.
Fallback Stratejileri
Her failure eşit değil. Bazen graceful degrade edebilirsin:
Circuit Breaker Inheritance
Mikroservisler başka mikroservisleri çağırırken, circuit state'i inherit et:
Gerçek Dünya Konfigürasyon Örnekleri
Production'da farklı servis tipleri için gerçekten işe yarayan:
Circuit Breaker'ları Test Etmek: Chaos Engineering
Test etmediğin circuit breaker'a güvenemezsin. Chaos testing yaklaşımımız:
Production'da AWS Fault Injection Simulator kullanarak random failure'lar inject edip circuit breaker'larımızın doğru respond ettiğini verify ediyoruz.
Bize Pahalıya Mal Olan Hatalar
Hata 1: Sadece Client-Side Circuit Breaking
Başta circuit breaker'ları sadece client'larda implement ettik. Server'ın kendisi problem yaşadığında kendini koruyamıyordu:
Hata 2: İlgisiz Operasyonlar İçin Circuit Breaker Paylaşmak
"Database operasyonları" için tek circuit breaker'ımız vardı. Write'lar fail ettiğinde read'ler de bloklanıyordu:
Hata 3: Business Impact'i Düşünmemek
Tüm servislere eşit davrandık. Sonra metrics collection'ı geçirirken payment processing'i blokadık. O dersi hızlı öğrendik.
Implementasyon Checklist'i
Circuit breaker'ları implement ederken kullanışlı bir checklist:
- Timeout'u P99 latency'nin 2-3 katına ayarla
- Half-open'dan kapanmadan önce birden fazla success iste
- Read/write operasyonları için ayrı breaker'lar implement et
- Business-critical path'ler için fallback davranışı ekle
- State değişiklikleri ve rejection'lar için metrik export et
- Production'dan önce chaos engineering ile test et
- Timeout ve threshold seçimlerini dokümante et
- Individual failure'larda değil circuit OPEN'da alert et
- Konfigürasyonda business priority'yi düşün
- Instant değil gradual recovery implement et
Son Düşünceler: Hızlı Fail Etmek Hakkında
Önemli bir kavrayış: bazen bir servisin yapabileceği en iyi şey hemen fail etmek. 10ms'de 503 response, 30 saniye sonra timeout'tan çok daha iyidir. Kullanıcılar hızlı retry edebilir, sistem recover olabilir. Thread exhaustion çok daha ciddi problemlere yol açar.
Circuit breaker'lar failure'ları önlemekle ilgili değil - failure'ların yayılmasını önlemekle ilgili. Problem düzeldiğinde gerçekten recover edebilecek kadar sistem sağlığını korumakla ilgili.
Circuit breaker'ları problemi yaşamadan önce implement etmek kriz yönetimini çok daha kolay hale getirir.