Circuit Breaker Deseni
- İngilizcesi
- Circuit Breaker Pattern
- Türkçe karşılığı
- devre kesici
- Okunuşu
- sörkit breykır petırn
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Circuit breaker deseni, arızalı bir bağımlılığa yapılan çağrıları bir süre durdurarak ve zaman aşımlarını beklemek yerine hızlıca hata vererek sistemi korur.
Circuit breaker deseni nedir?
Dağıtık sistemlerde bir servis çoğunlukla ağ üzerinden başkalarına bağımlıdır. Bir bağımlılık yavaşladığında ya da erişilemez olduğunda, istek göndermeyi sürdüren çağıranlar zaman aşımlarını beklerken iş parçacıklarını ve bağlantıları boşa harcar; sorun tüm sistem yavaşlayana kadar yayılabilir, buna kademeli arıza (cascading failure) denir. Circuit breaker deseni, bu uzak çağrıları tekrarlayan hataları fark edip bir süre çağırmayı bırakan bir korumayla sarar.
Bir circuit breaker'ın üç durumu vardır. Kapalı (closed) durumda istekler normal şekilde geçer ve breaker hataları sayar. Hatalar art arda 5 ya da son çağrıların yarısı gibi bir eşiği aştığında açık (open) duruma geçer ve her çağrı, zorlanan servise dokunmadan anında hata verir ya da önbellekteki veri gibi bir yedek yanıt (fallback) döndürür. Bir soğuma süresinden sonra yarı açık (half-open) duruma geçer ve birkaç deneme isteğinin geçmesine izin verir: başarılı olurlarsa yeniden kapanır, başarısız olurlarsa tekrar açılır.
Ad, evinizdeki elektrik sigortasından gelir: çok fazla akım aktığında devreyi keser ve kablolamayı korumak için elektriği kapatır; sorun giderildikten sonra siz onu sıfırlarsınız. Yazılım circuit breaker'ları mikroservislerde, API istemcilerinde ve service mesh'lerde yaygındır ve genellikle sıfırdan yazılmak yerine dayanıklılık kütüphaneleri ya da proxy'ler tarafından sağlanır.
Circuit breaker'lar sıklıkla yeniden denemeler (retry) ve hız sınırlamayla (rate limiting) karıştırılır. Yeniden deneme, başarısız bir çağrıyı başarılı olur umuduyla tekrarlar; bu da aşırı yüklü bir servisi daha da kötüleştirebilir. Circuit breaker ise çağırmayı bilerek durdurur; ikisi birlikte en iyi çalışır: kısa aksaklıklar için yeniden denemeler, daha uzun kesintiler için breaker. Hız sınırlama ise bir servisi çok fazla gelen istekten korurken, circuit breaker çağıranı arızalı bir bağımlılıktan korur.
Bir bakışta
Önemli noktalar
- Circuit breaker uzak çağrıları sarar ve tekrarlanan hatalardan sonra durdurur.
- Kapalı çağrıları geçirir, açık hızlıca hata verir, yarı açık ise servisin düzelip düzelmediğini dener.
- Hızlı hata vermek kademeli arızaları önler ve iş parçacıklarını ile bağlantıları serbest bırakır.
- Önbellekteki veri ya da varsayılan yanıt gibi yedekler kullanıcı deneyimini kullanılabilir tutar.
- Yeniden denemelerin ve zaman aşımlarının yerini almaz, onları tamamlar.
Örnek
let failures = 0;
let openedAt = 0; // when the circuit last tripped open
async function withBreaker<T>(fn: () => Promise<T>): Promise<T> {
// Open: after 5 failures, fail fast for 30 seconds without calling the service
if (failures >= 5 && Date.now() - openedAt < 30_000) throw new Error("Circuit open");
try {
const result = await fn(); // closed, or a half-open trial after the cooldown
failures = 0; // success closes the circuit
return result;
} catch (err) {
if (++failures >= 5) openedAt = Date.now(); // trip (or re-trip) to open
throw err;
}
}Sık sorulan sorular
Circuit breaker'ın üç durumu nelerdir?
Kapalı, hatalar sayılırken çağrıların normal aktığı anlamına gelir. Açık, çağrıların servise ulaşmadan anında başarısız olduğu anlamına gelir. Yarı açık ise servisin düzelip düzelmediğini kontrol etmek için soğuma süresinden sonra birkaç deneme çağrısına izin verildiği anlamına gelir.
Circuit breaker ile yeniden deneme (retry) arasındaki fark nedir?
Yeniden deneme, sorun geçici olabilir diye başarısız bir çağrıyı tekrarlar. Circuit breaker ise zorlanan bir servise toparlanma zamanı vermek için tekrarlanan hatalardan sonra çağırmayı bırakır; yeniden denemeler genellikle breaker'ın içinde, denemeler arasında artan bir gecikmeyle çalışır.
Devre açıkken istekler ne olur?
Hızlıca başarısız olurlar; genellikle çağıranın ele alabileceği bir hata verirler ya da önbellekteki veri, varsayılan bir değer veya kullanıcı dostu bir mesaj gibi bir yedek yanıt döndürürler. Bu, çağıranı zaman aşımlarında takılıp kalmak yerine duyarlı tutar.
İlgili sayfalar
- MikroservislerYazılım Mimarisi, s. 24Mikroservisler, bir uygulamanın ağ üzerinden iletişim kuran, küçük ve bağımsız olarak dağıtılabilen servislere bölündüğü bir mimari tarzdır.
- Service MeshDevOps ve Bulut, s. 47Service mesh, mikroservisler arası trafiği yöneten; kod değiştirmeden şifreleme, yeniden deneme, yönlendirme ve izleme ekleyen bir altyapı katmanıdır.
- API GatewayBackend ve API'ler, s. 3API gateway, bir grup backend servisinin önünde duran ve API isteklerini alan, kontrol eden ve yönlendiren tek giriş noktası görevi gören bir sunucudur.
- Rate LimitingBackend ve API'ler, s. 37Rate limiting, istemcinin belli bir sürede yapabileceği istek sayısını sınırlayıp sunucuyu ya da API'yi kötüye kullanımdan ve aşırı yükten koruyan tekniktir.
- ÖlçeklenebilirlikYazılım Mimarisi, s. 30Ölçeklenebilirlik, bir sistemin daha fazla kullanıcı ya da veri gibi artan iş yükünü, kaynak ekleyerek performansı düşmeden karşılayabilme yeteneğidir.
- Tasarım DeseniYazılım Mimarisi, s. 42Tasarım deseni, yazılım tasarımında sık görülen bir soruna kanıtlanmış, yeniden kullanılabilir çözümdür; hazır kod değil, genel bir şablon olarak anlatılır.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin