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.
Ü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ş IHttpClientFactory
olarak nasıl kullanabileceğiniz gösterilmektedir.
.NET paketlerini yükleme
İlk olarak paketi yüklemeniz Microsoft.Extensions.Http.Polly
gerekir.
- Visual Studio ile yükleme
- dotnet CLI ile yükleme
- nuget.exe CLI ile yükleme
- Paket Yöneticisi Konsolu ile yükleme (PowerShell)
.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.Polly
de 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
Yeniden deneme düzenihttps://learn.microsoft.com/azure/architecture/patterns/retry
Polly ve IHttpClientFactoryhttps://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory
Polly (.NET dayanıklılığı ve geçici-hata işleme kitaplığı)https://github.com/App-vNext/Polly
Polly: Jitter ile yeniden denemehttps://github.com/App-vNext/Polly/wiki/Retry-with-jitter
Marc Brooker. Değişim: Rastgelelik ile İşleri Daha İyi Hale Getirme https://brooker.co.za/blog/2015/03/21/backoff.html