Lab 07 / 09Circuit breaker ve retry fırtınası simülatörü

Sigortayı Attır

Bir downstream API’yi boz; naif retry’ların onu nasıl fırtınaya çevirdiğini izle — sonra bir circuit breaker’ın Closed → Open → Half-open geçişleriyle onu kurtarmasına bak.

  • Circuit breaker
  • Retries & jitter
  • Timeouts
Circuit breaker
Retry

Otomatik oynatma · kontrolü almak için herhangi bir ayara dokunun

Başarılı
100%
Fallback
0%
Hata
0%
Kullanıcı p95
—
API’ye yük
×1.0
Açılma
0
API’ye deneme/snkullanıcı req/snhata

Simülasyon · saniyede 25 kullanıcı request’i · payments-api aynı anda 12 çağrı kaldırır, fazlasında yavaşlar · 1sn client timeout · breaker: 20’lik sayı tabanlı pencere, %50’de açılır, 2sn bekler, half-open’da 3 deneme · görebilmeniz için 2.5× yavaşlatıldı

Melih Kızmaz yaptı · tamamen tarayıcında çalışır

Burada ne görüyorsunuz

Kullanıcılar checkout-svc’yi çağırıyor, o da payments-api’yi. API aynı anda yaklaşık on iki çağrıyı kaldırabiliyor; bunun üstünde yavaşlıyor, yavaşladıkça da çağrılar birikiyor. Her çağrının bir saniyelik client timeout’u var — client vazgeçtiğinde API bunu bilmiyor: terk edilmiş çağrı üzerinde çalışmaya devam ediyor (içi boş noktalar) ve kimsenin kullanmayacağı kapasiteyi yakıyor.

Retry’lar bir kesintiyi neden kötüleştirebilir

Hemen tekrar denemek dayanıklılık gibi hissettirir; ama API aşırı yük yüzünden hata veriyorsa her retry daha fazla yük demektir. Üç anlık retry ile API, tam da en az kaldırabileceği anda gerçek trafiğinizin iki üç katını görebiliyor — “API’ye yük” değeri bunu gösteriyor. Full jitter’lı exponential backoff, retry’ları dağıtıp senkron dalgalar halinde gelmelerini engelliyor; ama ölü bir bağımlılığı canlandıramıyor.

Breaker aslında ne yapıyor

Breaker son yirmi çağrının sonucunu sayıyor. En az yarısı hata ya da timeout ile bittiyse devre açılıyor: çağrılar bir saniye bekleyip patlamak yerine anında bir fallback ile (cache’lenmiş ya da kısıtlı bir cevap) yanıtlanıyor ve API’ye toparlanması için alan kalıyor. Bekleme süresinden sonra half-open’a geçip üç deneme çağrısını geçiriyor; başarılı olurlarsa kapanıyor, biri patlarsa tekrar açılıyor. resilience4j, Polly ya da opossum’daki yapı da bu — patlayan bir bağımlılık size thread değil, milisaniye kaybettirmeli.

Sayılar bir model, benchmark değil; noktalar görülebilsin diye her şey gerçek zamandan 2.5 kat yavaş çalışıyor. Ama ödünleşim gerçek: fazla hevesle açılan bir breaker, aslında sorunsuz cevap alacak kullanıcılara fallback sunar. Bu yüzden eşik, pencere boyutu ve anlamlı bir fallback, desenin kendisi kadar önemli.