Apache Kafka İçin Retry Ve Circuit Breaker Pattern Uygulanması

Mert Türkman
3 min readDec 5, 2022

--

Merhaba arkadaşlar, bu yazımda retry ve circuit breaker pattern yapılarının ne işe yaradıklarını ve önemini anlatıcam ardından yüksek performanslı dağıtık mesajlaşma sistemi olan Apache Kafka ile örnek bir uygulama yapıcağız. Haydi Başlayalım 😀

Retry Pattern Nedir ?

Retry pattern, herhangi bir servis isteğinde veya mesajın consume edilme sürecinde hata oluşması durumunda aynı işlemin anında veya belirli süreler aralığında tekrar denenmesini sağlayan pattern yapısına verilen isimdir.

Burdaki en önemli amaç uygulamanın hata toleransını arttırmaktır, yani herhangi bir hata oluştuğunda işlemi tekrar deneyerek yapılan işlemin hata almadığı durumu elde etmek.

En çok kullanılan üç adet retry pattern yapısı mevcuttur. Bunlar;

  • Immediate retry: Hata alındığı anda işlemin tekrar denenmesi
  • Intervals retry: Belirli aralıklar ile hata alının işlemin tekrarlanması
  • Incremental intervals: Bu yapıda işlem her gerçekleşip hata alındığında işlemin tekrarlanma aralığı belirlenen oranda artar.

Yukarıdaki örnekteki gibi , bir siparişin oluşturulmak istendiğini ve bu sırada serviste herhangi bir x sebeple problem oluştuğunu düşününelim. Doğal olarak bu işlem yapılırken hata alacağız buraya kadar tamam peki hata alan sipariş ne olucak ? Yok olucak değil tabiki işte retry pattern bu noktada önem kazanıyor. Aynı işlemin tekrar denenerek başarılı olunan duruma erişilmesini sağlanır retry pattern uygulanarak.

Bu pattern servisin overload olmasını veya idempotency gibi bazı problemlere yol açabilicek dezavantajlara sahiptir. Retry pattern kullanıcaksak yazılım mimarimiz bu yapıya uygun olmalıdır.

Circuit Breaker Pattern Nedir ?

Circuit breaker pattern, hatalı işlemlerin tekrar ederek overload problemi yaratılmasını belirli bir sınırdan sonra durdurarak sistemin kendisini toparlamasına izin veren patterndir. Retry pattern yapısı için gerekli bir patterndir, sürekli hata alan işlemlerin retry edilmesi sistemin down olmasına kadar ciddi problemlere yol açabilir bu nedenle retry pattern ile kullanılması daha doğru olucaktır.

Circuit breaker yapısında üç durum vardır. Bunlar;

  • Closed: Uygulamanın beklendiği gibi çalıştığı ve tüm veri trafiğinin sağlıklı bir şekilde ilerlediği durumu ifade eder.
  • Open: Sistemin kendini toparlaması için veri trafiğini durdurma durumudur.
  • Half Open: Tanımlanan süre sonra servisin durumunu test etmek için belirli bir sayıda veya sürede isteklerin veri akışının devam etmesi durumudur. Eğer hata limiti yine aşılırsa open durumuna geçmelidir ama veri akışı sağlıklı bir şekilde sağlanırsa closed durumuna geçmelidir.

Örnek Proje

Arkadaşlar örnek projemizde basit bir consumer producer uygulaması yapıcaz, lakin farklı olan noktaları retry, circuit breaker pattern yapılarını kullanıcak ve concurrency bir şekilde çalışabilicek olmasıdır.

Basit olarak açıklamak gerekirse aslında süreçlerimiz yukarıdaki grafikte gördüğünüz gibidir. Projemizde 3 topic mevcut bunlar; main topic, retry topic ve dead topic. Order consumer tarafından main topic consume edilir ve hata oluştuğundan mesaj retry topic’e produce edilir. Retry consumer tarafından işlem başarılı olana kadar n kez consume edilebilir ve n kez hata alınırsa mesaj dead topice atılır.

Yine burda concurrency yapısı ile işlemler eş zamanlı bir şekilde gerçekleştiği için mesajlarlar daha hızlı consume edilir.

Retry ve concurrency yapıları BaseConsumer tarafından yönetilmektedir. Configte tanımlanan sayı veya süre aralığında mesaj consume ediliyor ve bu mesajlar eş zamanlı olarak işlenebiliyor. Eğer hata alınırsa mesaj tanımlanan zaman aralığında n kez consume edilebilir ve hata almaya devam ederse dead topice produce edilir.

Projenin kaynak kodlarına burdan erişebilirsiniz.

Elimden geldiğince anlaşılır şekilde anlatmaya çalıştım umarım faydalı olmuştur 🙂

--

--