DEV Community ­čĹęÔÇŹ­čĺ╗­čĹĘÔÇŹ­čĺ╗

Cover image for Resilience4j
Mustafa Emre Ba┼čar
Mustafa Emre Ba┼čar

Posted on

Resilience4j

Resilience4j, birbirleri ile ileti┼čim i├žerisinde bulunan sistemler i├žin hata tolerans─▒n─▒ y├Âneterek daha esnek bir yap─▒ i├žerisinde
i┼člemlerin─▒ s├╝rd├╝rmelerine yard─▒mc─▒ olan bir k├╝t├╝phanedir. Bir noktadaki hatan─▒n b├╝t├╝n sistemi etkilememesi as─▒l ama├žt─▒r.

Ger├žekle┼čtirmesinde Decorator Pattern ve Fonksiyonel Programlama konseptlerinden faydalan─▒r.

Bu esnek yap─▒y─▒ olu┼čturmak i├žin ├že┼čitli temel par├žalar i├žerir;

  • CircuitBreaker
  • Retry
  • TimeLimiter
  • RateLimiter
  • Bulkhead

Circuit Breaker

Sistemdeki hata veya gecikmenin belirlenebilen bir e┼čik de─čerinin ├╝zerine ├ž─▒kt─▒─č─▒ durumlarda, kaynaklar─▒n bo┼ča harcanmamas─▒ i├žin ba─člant─▒n─▒n kesilmesi olay─▒d─▒r.

Bu oran─▒ g├Âzlemlemek i├žin sliding window kullan─▒l─▒r ve iki tipi vard─▒r;

  • Count Based : Son N ├ža─čr─▒ g├Âz ├Ân├╝nde bulundurulur ve ├ž─▒kt─▒lar─▒n─▒ N boyutunda bir circular array i├žerisinde toplar. Bu ├ža─čr─▒larda gecikme veya hata oran─▒ e┼čik de─čeri a┼čarsa, devre kesilir.
  • Time Based : Son N saniyede gelen ├ža─čr─▒lar─▒n ├ž─▒kt─▒lar─▒ i├žin N boyutunda bir circular array olu┼čturur. Her bir indeks bir saniyelik aral─▒─ča denk gelmektedir. Her bir indekste hatal─▒, gecikmeli ve toplam ├ža─čr─▒lar─▒ belirten 3 ayr─▒ integer tutulur. Bu de─čerlerin oran─▒na g├Âre devrenin kesilmesine karar verilir.

Tan─▒mlanan listelere veri giri┼či oldu─ču zaman yap─▒lan hesaplama ile belirlenen hata ve gecikme e┼čik de─čerleri kar┼č─▒la┼čt─▒r─▒l─▒r ve durum de─či┼čiklikleri yap─▒l─▒r.

  • failureRateThreshold : Hata oran─▒n─▒n e┼čik de─čeridir, varsay─▒lan olarak %50 durumundad─▒r.
  • slowCallRateThreshold : Gecikme oran─▒n─▒n e┼čik de─čeridir, varsay─▒lan olarak %100 durumundad─▒r. Bir ├ža─čr─▒n─▒n gecikme olarak kabul edilmesi de (slow call) slowCallDurationThreshold de─čerine ba─čl─▒d─▒r. Varsay─▒lan olarak 60000 ms ├╝zeri s├╝ren bir ├ža─čr─▒ gecikme olarak kabul edilir.

Bu e┼čik de─čerleri ile ilgili bir di─čer ├Ânemli bir nokta da, kontrole dahil edilmeleri, toplam istek say─▒s─▒n─▒n minimumNumberOfCalls de─čerini a┼čmas─▒ndan sonra ger├žekle┼čir. ├ľrne─čin bu de─čer 10 oldu─čunda, gelen 9 istek de hatal─▒ olsa dahi minimumNumberOfCalls de─čeri hen├╝z a┼č─▒lmad─▒─č─▒ i├žin devre kesilmez.

Devre Durumlar─▒

circuitbreakerstates

Devrenin bulunabilece─či 3 farkl─▒ durum s├Âz konusudur;

  • CLOSED : Devre kesiminin ger├žekle┼čmedi─či, her ┼čeyin normal seyrinde devam etti─či durumdur.
  • OPEN : Hata veya gecikme oranlar─▒n─▒n e┼čik de─čerleri a┼č─▒ld─▒─č─▒nda sistemin bulundu─ču durumdur. Bu durumda iken gelen istekler CallNotPermittedException hatas─▒ ile geri ├ževrilir.
  • HALF-OPEN : Kesilmi┼č bir devrenin, waitDurationInOpenState ile belirlenen s├╝reyi beklemesinden sonra, direk olarak CLOSED durumuna ge├žmek yerinde ge├žti─či ara durumdur. Bu durumda permittedNumberOfCallsInHalfOpenState ile belirtilen miktarda istek al─▒nmas─▒na izin verilir. E─čer bu isteklerdeki hata veya gecikme oran─▒ e┼čik de─čerlerinden y├╝ksek ise tekrar OPEN durumuna, de─čil ise CLOSED durumuna ge├žilir. Bu duruma ge├ži┼čin otomatik bir ┼čekilde yap─▒lmas─▒ i├žin automaticTransitionFromOpenToHalfOpenEnabled de─čerinin true olarak ayarlanmas─▒ gereklidir.

Bu i┼člemeler dahilinde varsay─▒lan olarak, b├╝t├╝n Exception tipleri hata olarak say─▒l─▒r. Ancak bu yakla┼č─▒m yerine kendi ayarlamalar─▒m─▒z─▒ da yapabiliriz;

  • recordExceptions listesi kullanarak hata olarak say─▒lmas─▒n─▒ istedi─čimiz Exception s─▒n─▒flar─▒n─▒ tan─▒mlayabiliriz. Bunlar haricindekiler ba┼čar─▒l─▒ olarak say─▒lacakt─▒r. Ayr─▒ca belirtilen s─▒n─▒flardan miras alm─▒┼č s─▒n─▒flar da ayn─▒ ┼čekilde ele al─▒nacakt─▒r.
  • ignoreExceptions listesi ile g├Ârmezden gelinecek Exception s─▒n─▒flar─▒n─▒ tan─▒mlayabiliriz. Bu s─▒n─▒flar ne ba┼čar─▒l─▒ ne de ba┼čar─▒s─▒z olarak kabul edilecektir.

Retry

Hata ile sonu├žlanan bir ├ža─čr─▒n─▒n otomatik olarak yeniden g├Ânderilmesi amac─▒yla kullan─▒l─▒r.

Retry ile alakal─▒ dikkat edilmesi gereken ├Ânemli bir nokta, ├ža─čr─▒ sonucu ├žal─▒┼čan operasyonun idempotent olmas─▒, yani tekrarlanan istekte gereksiz olan bulunuyorsa bunun g├Ârmezden gelinebilmesidir, aksi takdirde mant─▒k hatalar─▒na yol a├žabilir. ├ľrne─čin operasyon i├žin ├ža─čr─▒ yap─▒ld─▒─č─▒nda, gerekli i┼člemler sa─čl─▒kl─▒ bir ┼čekilde ger├žeke┼čtirilmi┼č olsun ancak geri d├Ân├╝┼čte bir problem olu┼čmu┼č olsun, bu durumda istek tekrarlanacak ve e─čer sistem buna haz─▒rl─▒kl─▒ de─čilse ayn─▒ i┼člemler tekrar yap─▒lmaya ├žal─▒┼č─▒lacakt─▒r.

Retry kullan─▒m─▒nda ├že┼čitli de─čerleri konfig├╝re edebiliriz ;

  • maxAttempts: Hata durumunda maksimum deneme say─▒s─▒n─▒ belirtir.
  • waitDuration: Her bir deneme aras─▒nda ge├žen sabit s├╝reyi belirtir.
  • enableExponentialBackoff: Denemeler aras─▒ndaki ge├žen s├╝renin sabit olmay─▒p, exponential ┼čekilde artaca─č─▒n─▒ belirtir. ├ľrne─čin, denemeler aras─▒nda ge├žen s├╝reler 2-4-8 ┼čeklinde artar

Yeniden deneme durumlar─▒ istenen ┼čekilde ayarlanabilir.

  • At─▒lan iste─če bir cevap d├Ân├╝lm├╝┼č ise konfig├╝rasyon dosyas─▒na eklenecek resultPredicate de─čeri ile hangi ko┼čulda retry yap─▒laca─č─▒ ayarlanabilir.

resultPredicate: io.reflectoring.resilience4j.springboot.predicates.ConditionalRetryPredicate

ConditionalRetryPredicate implements Predicate<SearchResponse> {
 @Override
 public boolean test(SearchResponse searchResponse) {
   if (searchResponse.getErrorCode() != null) {
     return searchResponse.getErrorCode().equals("FS-167");
   } 
   return false;
 }
}
  • ─░stek ger├žekle┼čtirilirken hata ger├žekle┼čmi┼č ise retryExceptionPredicate kullan─▒larak, hata incelenip retry yap─▒l─▒p yap─▒lmayaca─č─▒na karar verilebilir veya retryExceptions ve ignoreExceptions de─čerleri kullan─▒larak direk olarak s─▒n─▒flar─▒na g├Âre filtreleme de yap─▒labilir.

retryExceptionPredicate: io.github.resilience4j.circuitbreaker.RecordFailurePredicate

public class RecordFailurePredicate implements Predicate<Throwable> {

   @Override
   public boolean test(Throwable throwable) {
       return throwable instanceof IOException || throwable instanceof IgnoredException;
   }
}

Time Limiter

TimeLimiter, ilgili uca yap─▒lan i┼člemin en fazla ne kadar zaman alaca─č─▒n─▒ belirlemek i├žin kullan─▒l─▒r.

  • TimeLimiter sadece asenkron i┼člemin yap─▒ld─▒─č─▒(CompletableFuture ile sa─članan) endpoint'lere uygulanabilir.

TimeLimiter kullan─▒m─▒nda ├že┼čitli de─čerleri konfig├╝re edebiliriz;

  • timeoutDuration: Gelen iste─čin zaman a┼č─▒m─▒ s├╝resini belirtir.
  • cancelRunningFuture: Hali haz─▒rda ├žal─▒┼čan future i├žin iptal edilip edilemeyece─čini belirtir.

Rate Limiter

Sisteme, belirtilen zaman aral─▒─č─▒ i├žerisinde gelebilecek istek say─▒s─▒n─▒ kontrol edebilmemizi sa─člar.

Rate Limiter kullan─▒m─▒nda ├že┼čitli de─čerleri konfig├╝re edebiliriz;

  • limitForPeriod: Belirtilen periyot i├žin izin verilecek azami istek say─▒s─▒r
  • limitRefreshPeriod: Verilen limit de─čerinin ge├žerli olaca─č─▒ s├╝reyi belirtir. S├╝re sonunda istek say─▒s─▒ s─▒f─▒rlan─▒r.
  • timeoutDuration: Limit de─čere ula┼č─▒ld─▒─č─▒nda, blokalanan thread i├žin ka├ž saniye beklenece─čini belirtir.

Bulkhead

Bulkhead ile gelen e┼čzamanl─▒ ├ža─čr─▒ say─▒s─▒n─▒ s─▒n─▒rlayabiliriz.

─░ki ┼čekilde ger├žekle┼čtirilebilir ;

  • SemaphoreBulkhead : Gelen isteklerin semafor yard─▒m─▒ ile kilitleme mant─▒─č─▒ ile y├╝r├╝t├╝lmesi.
  • FixedThreadPoolBulkhead : Gelen her istek i├žin, olu┼čturulan thread havuzundan uygun bir thread al─▒n─▒r ve izole bir ┼čekilde i┼člemler ger├žekle┼čtirilir..

Semafor yakla┼č─▒m─▒ i├žin iki de─čer konfig├╝re edilebilir;

  • maxConcurrentCalls: Bulkhead taraf─▒ndan ayn─▒ anda y├╝r├╝t├╝lebilecek, azami istek say─▒s─▒n─▒ belirtir.
  • maxWaitDuration: Belirlenen maxConcurrentCalls say─▒s─▒n─▒n a┼č─▒m─▒na sebep olan iste─čin ne kadar s├╝re bloklanaca─č─▒n─▒ belirtir.

Thread havuzu yakla┼č─▒m─▒ i├žin ├že┼čitli de─čerler konfig├╝re edilebilir;

  • coreThreadPoolSize : Olu┼čturlan havuz i├žin sabit(minimum) thread miktar─▒n─▒ belirtir.
  • maxThreadPoolSize : coreThreadPoolSize miktar─▒ndan daha fazla thread kullan─▒m─▒ gerekti─činde, ge├žici ┼čekilde olu┼čturulabilecek yeni threadlerin azami miktar─▒n─▒ belirtir.
  • queueCapacity : Thread havuzunda uygun thread bulunmad─▒─č─▒nda gelen isteklerin bekletilece─či s─▒ran─▒n kapasitesini belirtir.
  • keepAliveDuration : Ge├žici olu┼čturulan threadlerin bo┼čta ne kadar s├╝re bekleyebilece─čini belirtir. Bu s├╝re a┼č─▒m─▒nda thread sonland─▒r─▒l─▒r.

Top comments (0)

­čîÜ Browsing with dark mode makes you a better developer by a factor of exactly 40.

It's a scientific fact.