Spring Retry ve Recover Kullanarak Hata Yönetimi 🔁🛠

Metehan Gültekin
folksdev
Published in
3 min readJun 7, 2024

Modern yazılım sistemlerinde, özellikle mikroservis mimarilerinde, geçici hatalar (örneğin, ağ bağlantı sorunları veya geçici hizmet kesintileri) sıklıkla karşılaşılan durumlardır. Bu tür geçici hataları yönetmek ve uygulamanızın güvenilirliğini artırmak için yeniden deneme (retry) mekanizmaları kullanılır. Spring Retry, bu tür mekanizmaları Spring uygulamalarında kolayca uygulamak için tasarlanmış güçlü bir kütüphanedir. Ayrıca, Spring Retry’nin `Recover` işlevi, tüm denemeler başarısız olduğunda uygulamanızın nasıl tepki vereceğini belirlemenize olanak tanır.

Spring Retry ve Recover Nedir?

Spring Retry
Spring Retry, belirli bir işlem başarısız olduğunda, bu işlemi otomatik olarak belirli sayıda tekrar denemenize olanak tanır. Örneğin, bir veritabanı bağlantısı kurmaya çalıştığınızda bir hata alırsanız, Spring Retry bu bağlantı denemesini otomatik olarak tekrar eder. Böylece, geçici hatalarla başa çıkabilir ve işlemlerin başarılı olma olasılığını artırabilirsiniz.

Spring Recover
Spring Recover ise tüm yeniden deneme girişimleri başarısız olduğunda devreye giren bir mekanizmadır. Recover işlevi, hata durumlarında alternatif bir işlem veya hata yönetimi stratejisi sunar. Bu, uygulamanızın beklenmeyen durumlarla daha zarif bir şekilde başa çıkmasını sağlar.

Spring Retry kullanarak bir proje geliştirelim

Projemizi oluşturmak için ilk adım olarak projemizin ihtiyaç duyduğu bağımlılıkları ekleyerek başlayalım. Bu kapsamda Spring Web, Spring Retry , Spring Aop ve Lombok bağımlılıklarını projemize eklememiz gerekiyor.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

Config için fazla şeye ihtiyacımız yok, sadece Application class’ına @EnableRetry eklememiz yeterli.

@EnableRetry: Bu işaretleme Spring’in metotları yeniden deneme desteğini etkinleştirmek için kullanılır.

Metot Açıklamaları

`retryOrderProcess` -> Bu metot, sipariş detayları boş ise `SQLException` fırlatır. Eğer `SQLException` meydana gelirse, metot üç kez yeniden denenir. Üç başarısız denemeden sonra, `recoverOrderProcess` metodu devreye girer ve bir kurtarma işlemi yapar.

`retryOrderProcessWithBackoff` -> Bu metot da, sipariş detayları boş ise `SQLException` fırlatır. `SQLException` durumunda, metot maksimum beş kez yeniden denenir. Her yeniden denemede bekleme süresi başlangıçta 2 saniye olup, her seferinde iki katına çıkarılacak şekilde artar. Maksimum bekleme süresi 30 saniyedir. Beş başarısız denemeden sonra, `recoverOrderProcessWithBackoff` metodu devreye girer ve bir kurtarma işlemi yapar.

Request ve Log Çıktıları

request-log

@Retryable Anotasyonu: Parametrelerin Detaylı Açıklaması

1. `value` veya `retryFor`
Bu parametre, hangi istisnalar karşısında yeniden deneme yapılacağını belirtir. Bir exception sınıfı veya exception sınıfı dizisi kabul eder.

@Retryable(value = { SQLException.class, IOException.class })

2. `exclude` veya `noRetryFor`
Bu parametre, yeniden deneme yapılmayacak exception’ı belirtir. Bu exception karşısında yeniden deneme yapılmaz.

@Retryable(exclude = { IllegalArgumentException.class, NullPointerException.class })

3. `maxAttempts`
Yeniden deneme girişimlerinin maksimum sayısını belirtir. Varsayılan değer 3'tür.

@Retryable(maxAttempts = 5)

4. `backoff`
Yeniden denemeler arasındaki bekleme süresini yapılandırmak için kullanılır. `@Backoff` anotasyonu ile birlikte kullanılır.

@Retryable(backoff = @Backoff(delay = 2000, multiplier = 2))

`@Backoff` Anotasyonunun Parametreleri:
- `delay`: İlk yeniden deneme öncesinde bekleme süresini (milisaniye cinsinden) belirtir.
- `multiplier`: Her başarısız denemeden sonra bekleme süresinin çarpanını belirtir.

1. deneme: delay = 2000 ms
2. deneme: delay = 2000 * 2 = 4000 ms
3. deneme: delay = 4000 * 2 = 8000 ms
...

- `maxDelay`: Bekleme süresinin maksimum değerini belirtir.
- `random`: Yeniden denemeler arasında rastgele bir gecikme ekler.

5. `recover`
Yeniden deneme girişimlerinin hepsi başarısız olursa çağrılacak metodun adını belirtir. Bu metod, hataları ele almak için bir geri kazanım mekanizması sağlar.

@Retryable(recover = "recoverOrderProcess")

6. `label`
Bu parametre, yeniden deneme işlemine bir etiket ekler. Bu etiket, özellikle loglama ve izleme gibi durumlar için yararlıdır.

@Retryable(label = "orderRetry")

Öne Çıkan Özellikler ve Faydalar

  • Dayanıklılık ve Güvenilirlik: Geçici hatalar karşısında işlemlerinizi tekrar deneyerek başarı şansını artırır ve sisteminizin güvenilirliğini sağlar.
  • Esneklik: Yeniden deneme stratejilerini kolayca özelleştirebilir, farklı gecikme süreleri ve deneme sayıları belirleyebilirsiniz.
  • Hata Yönetimi: Recover işlevi ile, tüm yeniden denemeler başarısız olsa bile uygulamanızın belirli bir şekilde tepki vermesini sağlayarak, hata yönetimini optimize edebilirsiniz.
  • Kod Temizliği: Karmaşık hata yönetim kodlarını azaltır ve kodunuzu daha temiz ve yönetilebilir hale getirir.

Projenin kaynak kodlarına buradan ulaşabilirsiniz.

Sonuna kadar okuduğunuz için teşekkür ederiz. Gitmeden önce:

  • Lütfen yazıyı alkışlamayı ve beni takip etmeyi unutmayın! 👏
  • Beni takip etmek isterseniz X| Linkedin| Github

İyi günler,
Bol kodlamalar :)

Kaynaklar

--

--