Polly ve .Net Core 3.0 Retry Pattern

Merhaba arkadaşlar, bugün kısa bir yazı olacak fakat güncel teknoloji gelişmeleri ve mimarilerinde yerini iyice almaya başlayan önemli bir open source kütüphaneden yani Polly’den bahsedeceğim. Sizlere polly ve .net core 3.0 kullanarak bir servis de retry yani yeniden deneme patternini anlatmaya çalışacağım. Polly network haberleşmesi sırasında bir çok patterni uygulamanızı sağlayan extension metodlar sunan bir kütüphanedir. Error, result handling, retry senaryoları, cache senaryoları gibi birçok alanda kullanılabilir.

Biz bu postta Polly ile retry pattern örneğini ve time out policy örneğini görmeye çalışacağız. Şimdi senaryo olarak istekleri alan bir servisimiz olsun ve arka tarafta isim döndüren başka bir apiye request atsın.

Fakat isim döndüren api de problemler olabilir, anlık cevap verememe durumları olabilir bu yüzden cevap alamadığı durumda 3 kere denesin . Buna ek olarak timeout durumunu handle etmek içinde eğer isteğe 20 saniye cevap alınamazsa polly hata döndürsün.
Evet senaryomuzu şimdi yazmaya başlayalım. Önce isim döndüren basit bi api endpoint hazırladım.

Name Api

[ApiController]
[Route("api/[controller]")]
public class NameController : ControllerBase
{
    public NameController()
    {
    }

    [HttpGet]
    public string Get()
    {
        return "Enes";
    }
}

Bizim servisimiz, https://localhost:44353/api/name url’i üzerinden isim döndürmektedir. Şimdi bunu kullanacak diğer apimizi yazalım.

Öncelikle nuget üzerinden Microsoft.Extensions.Http.Polly (kurduğum version 3.1.0) kuralım. Daha sonra startup da ilgili polly konfigürasyonumuzu yapalım.

Startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();        
            services.AddHttpClient("nameClient")
                .AddPolicyHandler(Policy.TimeoutAsync(20).AsAsyncPolicy<HttpResponseMessage>())
                .AddTransientHttpErrorPolicy(p => p.RetryAsync(3));
        }

Burada retry seçeneği aşağıdaki gibi farklı bir strateji ile uygulanarak, istek aralarında ki süreler belirlenebilir. Fakat biz senaryomuz için üstteki kod bloğunu kullanacağız.

  .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[]
    {
        TimeSpan.FromSeconds(1),
        TimeSpan.FromSeconds(5),
        TimeSpan.FromSeconds(10)
    }))

Örnek için istekleri alacağımız endpointi yazalım.

Polly Example Api

    [Route("api/[controller]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly IHttpClientFactory _clientFactory;
        public HomeController(IHttpClientFactory clientFactory)
        {
            _clientFactory = clientFactory;
        }
        
        [HttpGet]
        public async Task<string> Get()
        {
            var url = $"https://localhost:44353/api/name";

            var client = _clientFactory.CreateClient("nameClient");
            var response = await client.GetAsync(url);
            var result = await response.Content.ReadAsStringAsync();
            return result;
           
        }
    }

Evet arkadaşlar örneğimizi ben iki senaryoda denedim . ilk olarak isim servisini ayağa kaldırmadan istek attığımda 20 saniye bekleyip daha sonra excepiton döndüğünü ve isim servisindeki endpointte excepiton fırlatarak 3 kez denediğini test ettim.

Umarım faydalı olmuştur. Kalın sağlıcakla …

Kaynaklar
http://www.thepollyproject.org/
https://www.c-sharpcorner.com/article/using-retry-pattern-in-asp-net-core-via-polly/

Asp.Net Core HttpClientFactory + Polly


https://www.telerik.com/blogs/using-polly-for-net-resilience-and-transient-fault-handling-with-net-core

Written By

Bir önceki günden daha iyi olmak için çalışarak kendimi geliştirmek, öğrendiklerim ve öğreneceklerim ile yazılım sektöründe büyük ölçekli ve uluslararası projelerde kendimden söz ettirmek istiyorum.

More From Author

You May Also Like

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir