Aracılığıyla paylaş


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

Tavsiye

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

.NET Mikro Hizmetler Mimarisi Kapsayıcılı .NET Uygulamaları için eKitabın kapak küçük resmi .

Ü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. Polly ilkelerini, Yeniden Deneme, Devre Kesici, Bölme Yalıtımı, Zaman Aşımı ve Geri Dönüş gibi uygulayarak bu yetenekleri gerçekleştirebilirsiniz. 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'in IHttpClientFactory'e entegre edilmiş http yeniden denemelerini 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 durumda, üstel geri çekilme ile HTTP Yeniden Denemeleri için bir Polly politikası 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ındaki 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 çekilmeli HTTP yeniden deneme ilkelerini belirten kademeli 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 titreme stratejisi ekleyin

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 yoğunluklarının üstesinden gelmek için iyi bir geçici çözüm, yeniden deneme algoritmasına/ilkesine rastgelelik stratejisi eklemektir. Bu strateji, uçtan uca sistemin genel performansını geliştirebilir. Polly: Jitter ile yeniden deneme bölümünde önerildiği gibi, üstel geri çekilmede iyi denetlenen ortanca başlangıç yeniden deneme gecikmesi ile sorunsuz ve eşit dağıtılmış yeniden deneme aralıklarıyla iyi bir rastgele gecikme 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