IHttpClientFactory ve Polly ilkeleriyle üstel geri alma ile HTTP çağrısı yeniden denemelerini uygulama

İpucu

Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi e-Kitabı'ndan bir alıntıdır.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Üstel geri alma ile yeniden denemeler için önerilen yaklaşım, açık kaynak Polly kitaplığı gibi daha gelişmiş .NET kitaplıklarından yararlanmaktır.

Polly, dayanıklılık ve geçici hata işleme özellikleri sağlayan bir .NET kitaplığıdır. Yeniden Deneme, Devre Kesici, Bölme Kafası Yalıtımı, Zaman Aşımı ve Geri Dönüş gibi Polly ilkelerini uygulayarak bu özellikleri uygulayabilirsiniz. Polly.NET Framework 4.x ve .NET Standard 1.0, 1.1 ve 2.0'ı (.NET Core ve üzerini destekler) hedefler.

Aşağıdaki adımlarda, önceki bölümde açıklanan Polly ile http yeniden denemelerini ile tümleştirilmiş IHttpClientFactoryolarak nasıl kullanabileceğiniz gösterilmektedir.

.NET paketlerini yükleme

İlk olarak paketi yüklemeniz Microsoft.Extensions.Http.Polly gerekir.

.NET 8 paketlerine başvurma

IHttpClientFactory .NET Core 2.1'den itibaren kullanılabilir ancak projenizde NuGet'ten en son .NET 8 paketlerini kullanmanızı öneririz. Genellikle uzantı paketine Microsoft.Extensions.Http.Pollyde başvurmanız gerekir.

Uygulama başlangıcında Polly'nin Yeniden Deneme ilkesiyle istemci yapılandırma

AddPolicyHandler() yöntemi, kullanacağınız nesnelere HttpClient ilke ekleyen yöntemdir. Bu örnekte, üstel geri alma ile Http Yeniden Denemeleri için bir Polly ilkesi ekleniyor.

Daha modüler bir yaklaşıma sahip olmak için Http Yeniden Deneme İlkesi, aşağıdaki kodda gösterildiği gibi Program.cs dosyasında ayrı bir yöntemde tanımlanabilir:

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
        .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
                                                                    retryAttempt)));
}

Önceki bölümlerde gösterildiği gibi, standart Program.cs uygulama yapılandırmanızda adlandırılmış veya yazılan bir istemci HttpClient yapılandırması tanımlamanız gerekir. Şimdi üstel geri alma ile Http yeniden denemeleri için ilkeyi belirten artımlı kodu aşağıdaki gibi ekleyin:

// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
        .SetHandlerLifetime(TimeSpan.FromMinutes(5))  //Set lifetime to five minutes
        .AddPolicyHandler(GetRetryPolicy());

Polly ile yeniden deneme sayısı, üstel geri alma yapılandırması ve hatayı günlüğe kaydetme gibi bir HTTP özel durumu olduğunda gerçekleştirebileceğiniz eylemlerle bir Yeniden Deneme ilkesi tanımlayabilirsiniz. Bu durumda, ilke iki saniyeden başlayarak üstel bir yeniden deneme ile altı kez deneyecek şekilde yapılandırılır.

Yeniden deneme ilkesine bir değişim stratejisi ekleme

Düzenli bir Yeniden Deneme ilkesi, yüksek eşzamanlılık ve ölçeklenebilirlik durumlarında ve yüksek çekişme durumunda sisteminizi etkileyebilir. Kısmi kesintilerde birçok istemciden gelen benzer yeniden denemelerin zirvelerinin üstesinden gelmek için iyi bir geçici çözüm, yeniden deneme algoritmasına/ilkesine bir değişim stratejisi eklemektir. Bu strateji, uçtan uca sistemin genel performansını geliştirebilir. Polly: Jitter ile yeniden deneme bölümünde önerileceği gibi, üstel geri almada iyi denetlenen ortanca ilk yeniden deneme gecikmesi ile sorunsuz ve eşit dağıtılmış yeniden deneme aralıklarıyla iyi bir değişim stratejisi uygulanabilir. Bu yaklaşım, sorun ortaya çıktığında ani artışların yayılmasına yardımcı olur. İlke aşağıdaki örnekte gösterilmiştir:


var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);

var retryPolicy = Policy
    .Handle<FooException>()
    .WaitAndRetryAsync(delay);

Ek kaynaklar