Polly Library: Hata Yönetimi ve Dayanıklılık Stratejileri

Hakan Güzel
4 min read4 days ago

--

Merhaba sevgili yazılım severler, Bugün sizlere son dönemde fazlasıyla ısınıp başımızın çıktığı bir konudan, yazılım geliştirirken hata yönetimi ve dayanıklılığı nasıl ele almamız gerektiğinden bahsedeceğim. Bu bağlamda bize yardım eden harika bir kütüphane var: Polly Library. İnanın bana, bu kütüphane yazılımcı hayatımı fazlasıyla kolaylaştırdı ve eminim sizin de işinize çok yarayacak.

Polly kütüphanesi, .NET ekosisteminde hata yönetimi ve dayanıklılık stratejilerini uygulamaya geçirmek için son derece kullanışlı bir araç. Yazılım geliştirme sürecinde en büyük sorunlardan biri, çoğu zaman dış servislerle, API’lerle ya da veritabanı ile olan entegrasyonlarda karşılaşılan hatalardır. Polly’nin sağladığı dayanıklılık (resilience) stratejileriyle bu tip sıkıntıları daha rahat bir şekilde yönetebiliriz.

Bu yazıda, Polly Library’nin ne olduğunu, nasıl kullanıldığını ve uygulamalarımızı daha dayanıklı hale getirmek için neler yapabileceğimizi detaylandıracağz. Hazır mısınız? Hadi başlayalım!

Polly Library Nedir?

Polly, bir .NET dayanıklılık ve hata yönetim kütüphanesidir. API istekleri sırasında karşılaşılan başarısızlıkları tekrar denemek, hataları yönetmek, gecikmelerle (backoff) tekrar denemek ya da devre kesici (circuit breaker) gibi stratejiler kullanarak uygulamalarımızın dayanıklılığını artırmak için kullanılır. Bu kütüphane, bir çok karmaşık hatayı basit bir şekilde yönetmemize yardımcı olur.

Mesela, geliştirirken genellikle dış servislere bağlıyız, değil mi? Dış bir servisin bir anda yanıt vermemesi ya da gecikmesi durumunda uygulamanızın kilitlenmesini istemeyiz. Polly burada devreye girer. Bize, belirli bir hatayı ya da istisnai durumu tekrar deneme, belirli bir süre bekleyip tekrar deneme ya da sistemde problem olduğunda devre kesici kullanarak bu problemi yönetme gibi seçenekler sunar.

Bir projede, çok sıkıntılı bir API ile çalışıyordum ve sürekli “timeout” hataları alıyorduk. Polly sayesinde, bu hataları kontrol altına alabildik ve kullanıcılara daha akıcı bir deneyim sunduk. Çünkü Polly’nin devre kesici yöntemi, belirli bir sayıda hata alındıktan sonra sistemi koruma altına alıp daha fazla çağrı yapılmasını engelliyordu.

Polly Kullanarak Hangi Stratejileri Uygulayabiliriz?

Polly kütüphanesi, bize birçok farklı strateji sunar ve bunları birleştirerek daha dayanıklı uygulamalar oluşturmamıza yardımcı olur. Şimdi bu stratejilere göz atalım:

1. Retry (Tekrar Deneme) Stratejisi

En basit ama en etkili stratejilerden biri, belirli bir hata aldığınızda bu işlemi tekrar denemek.

Bir senaryo düşünün: Çevrimiçi bir ödeme sistemine bağlandınız ve ödeme isteğiniz zaman aşımına uğradı. Bu durumda tekrar denemek ödeme işleminin başarılı olmasına olanak tanıyabilir. Polly’nin Retry politikası sayesinde, özellikle geçici hatalarda (transient faults) işlerin tekrar deneme ile düzelmesi mümkün hale gelir.

Küçük bir anımı paylaşayım: Bir seyahat rezervasyonu uygulaması geliştirirken, kullanıcıların çok sık otel sorgulamaları yapması gerekiyordu. Dış servisten gelen yanıt bazen gecikiyordu. Polly’nin Retry stratejisiyle bu sorguları özellikle gecikme durumunda tekrar denedik ve kullanıcı deneyimini büyük ölçüde iyileştirdik.

2. Circuit Breaker (Devre Kesici) Stratejisi

Devre Kesici, Polly’nin en popüler stratejilerinden biridir. Belirli bir sayıda hata alındığında sistemi koruma altına alır ve daha fazla işlem yapılmasını engeller. Bu sayede, bir API’nin çöktüğü bir durumda, arka arkaya binlerce isteğini boşuna atmamış olursunuz.

Mesela, bir çok e-ticaret sitesi bu stratejiyi kullanır. Örneğin, ödeme servisleri geçici olarak kullanılamaz hale geldiğinde, devre kesici devreye girer ve kullanıcıların sürekli aynı hatayı almasını engeller. Bunun yerine, kullanıcıya çökme bildirilir ve bir süre sonra tekrar denenmesi istenir.

3. Timeout (Zaman Aşımı) Stratejisi

Bir çağrının belirli bir süre içinde sonuçlanmaması durumunda, Polly ile bu işlemi sonlandırabiliriz. Bu sayede kaynakların boşuna tuna t\u00fkenmesini önleyebilir ve daha verimli bir sistem yaratabiliriz.

Bir seferinde, dış bir API ile çalışırken belirli bir sorgu çok uzun sürebiliyordu. Polly’nin Timeout politikaları ile belirli bir süre sonra bu sorguları sonlandırdık ve kullanıcılarımıza beklemek zorunda olmadıklarını hissettirdik. Bu, son kullanıcı memnuniyetini ciddi anlamda etkiledi.

4. Fallback (Yedek Plan) Stratejisi

Fallback stratejisi, bir hata meydana geldiğinde alternatif bir yanıt sunmamıza olanak tanır. Örneğin, bir veritabanı sorgusu başarısız olursa, kullanıcıya bir “şu an hizmet kullanılamıyor” mesajı sunmak yerine, Polly’nin yardımıyla belirli bir varsayılan veri sunabilirsiniz.

Daha önce çalıştığım bir uygulamada kullanıcı profillerini gösterirken bazen veriçekme işleminde sorunlar yaşıyorduk. Polly Fallback kullanarak bu durumda kullanıcıya “Profil bilgileri şu an görüntülenemiyor, lütfen daha sonra deneyin” mesajı göndermeye başladık. Bu da kullanıcıya hizmetin kullanılamadığı hissi yerine, kontrollü bir durumda olduğumuz hissini verdi.

Polly ve Dayanıklılık Stratejilerinin Avantajları

Polly kütüphanesi, hata yönetimini kolaylaştırarak geliştiricilere ciddi anlamda zaman kazandırır. Eğer siz de büyük ve karmaşık bir sistemde çalışıyorsanız, bu tarz dayanıklılık stratejilerinin faydasını hissedersiniz.

Mesela, Retry stratejisi başarısızlıkları azaltır ve sistemi stabil hale getirir. Circuit Breaker, sisteminizin daha da zorlanmasını önler ve bir çökme durumunda kontrolü elinizde tutmanızı sağlar. Bu da uzun vadede daha az çökme ve daha yüksek kullanıcı memnuniyeti demektir.

Polly, aynı zamanda uygulamaların dayanıklılığını artırarak hem geliştirici ekiplerine hem de şirketlere zaman kazandırır. Hatayı erken aşamada tespit etmek ve onu öngörülebilir hale getirmek, son kullanıcı memnuniyetini de artırır.

Polly’nin Kod Örnekleri

Biraz da kod yazalım, ne dersiniz? Polly kütüphanesini kullanarak basit bir retry ve circuit breaker örneğini inceleyelim:

var retryPolicy = Policy
.Handle<HttpRequestException>()
.WaitAndRetry(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
(exception, timeSpan, retryCount, context) =>
{
Console.WriteLine($"Tekrar deneme sayısı: {retryCount}, Hata: {exception.Message}");
});

var circuitBreakerPolicy = Policy
.Handle<HttpRequestException>()
.CircuitBreaker(2, TimeSpan.FromMinutes(1),
onBreak: (exception, duration) =>
{
Console.WriteLine($"Devre kesildi. Süre: {duration}");
},
onReset: () =>
{
Console.WriteLine("Devre yeniden bağlantıya hazır!");
});

// Politikalardan bir zincir oluşturalım
var policyWrap = Policy.Wrap(retryPolicy, circuitBreakerPolicy);

await policyWrap.ExecuteAsync(async () =>
{
// Burada bir HTTP isteği yapıyoruz (veya herhangi bir dış servis çağrısı)
var response = await httpClient.GetAsync("https://ornek-api.com/data");
response.EnsureSuccessStatusCode();
Console.WriteLine("Başarılı bir çağrı yapıldı!");
});

Yukarıdaki kodda, bir HTTP isteği gerçekleştiriyoruz ve Polly ile bu isteğte bir hata olursa 3 kez tekrar deneyerek (retry) ve belirli sayıda hata alındıktan sonra devreyi keserek (circuit breaker) bu çağrıyı yönetiyoruz.

Polly ile Dayanıklı Uygulamalar Oluşturma

Polly kütüphanesini kullanarak dayanıklılığı artırılmış uygulamalar oluşturmak, geliştirici ekipleri için bir lütuf gibidir. Hataları kontrol altına almak, kullanıcı deneyimini kesintisiz hale getirmek ve sisteminizi stabil tutmak için Polly’nin stratejileri çok faydalı.

Daha fazla öğrenmek istiyorsanız, Polly’nin resmi dokümanlarını ziyaret edebilirsiniz. Hepinize hata yönetiminde başarılar diliyorum ve Polly kütüphanesiyle daha dayanıklı sistemler geliştirmenizi umuyorum. Teşekkürler ve mutlu kodlamalar!

--

--