Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Tips/Råd
Det här innehållet är ett utdrag från eBook, .NET Microservices Architecture for Containerized .NET Applications, tillgängligt på .NET Docs eller som en kostnadsfri nedladdningsbar PDF som kan läsas offline.
Den rekommenderade metoden för återförsök med exponentiell backoff är att dra nytta av mer avancerade .NET-bibliotek som Polly-biblioteket med öppen källkod.
Polly är ett .NET-bibliotek som tillhandahåller funktioner för motståndskraft och hantering av tillfälliga fel. Du kan implementera dessa funktioner genom att tillämpa Polly-principer som Retry, Circuit Breaker, Bulkhead Isolation, Timeout och Fallback. Polly riktar in sig på .NET Framework 4.x och .NET Standard 1.0, 1.1 och 2.0 (som stöder .NET Core och senare).
Följande steg visar hur du kan använda Http-återförsök med Polly integrerat i IHttpClientFactory
, vilket beskrivs i föregående avsnitt.
Installera .NET-paket
Först måste du installera Microsoft.Extensions.Http.Polly
paketet.
- Installera med Visual Studio
- Installera med dotnet CLI
- Installera med nuget.exe CLI
- Installera med Package Manager Console (PowerShell)
Referera till .NET 8-paketen
IHttpClientFactory
är tillgängligt eftersom .NET Core 2.1, men vi rekommenderar att du använder de senaste .NET 8-paketen från NuGet i projektet. Du behöver vanligtvis också referera till tilläggspaketet Microsoft.Extensions.Http.Polly
.
Konfigurera en klient med Pollys återförsöksprincip i appstart
Metoden AddPolicyHandler() är det som lägger till principer i de HttpClient
objekt som du ska använda. I det här fallet lägger den till en Polly-policy för HTTP-återförsök med exponentiell backoff.
Om du vill ha en mer modulär metod kan http-återförsöksprincipen definieras i en separat metod i Program.cs-filen , enligt följande kod:
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
retryAttempt)));
}
Som det visas i de föregående avsnitten måste du definiera en namngiven eller typad HttpClient-konfiguration för klienten i standardkonfigurationen av Program.cs för appen. Nu lägger du till inkrementell kod som anger principen för Http-återförsök med exponentiell backoff enligt följande:
// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
.SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Set lifetime to five minutes
.AddPolicyHandler(GetRetryPolicy());
Med Polly kan du definiera en återförsöksprincip med antalet återförsök, exponentiell backoff-konfiguration och de åtgärder som ska utföras när det finns ett HTTP-undantag, till exempel loggning av felet. I det här fallet är principen konfigurerad för att prova sex gånger med ett exponentiellt nytt försök, med början i två sekunder.
Lägga till en jitterstrategi i återförsöksprincipen
En vanlig återförsöksprincip kan påverka systemet vid hög samtidighet, skalningsförmåga och under hög belastning. För att övervinna toppar med liknande återförsök som kommer från många klienter i partiella avbrott är en bra lösning att lägga till en jitterstrategi i algoritmen/principen för återförsök. Den här strategin kan förbättra den övergripande prestandan för systemet från slutpunkt till slutpunkt. Som vi rekommenderar i Polly: Försök igen med Jitter kan en bra jitterstrategi implementeras genom smidiga och jämnt fördelade återförsöksintervall som tillämpas med en välkontrollerad medel initial återförsöksfördröjning vid en exponentiell backoff. Den här metoden hjälper till att sprida ut toppar när problemet uppstår. Principen illustreras av följande exempel:
var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);
var retryPolicy = Policy
.Handle<FooException>()
.WaitAndRetryAsync(delay);
Ytterligare resurser
Mönster för återförsökhttps://learn.microsoft.com/azure/architecture/patterns/retry
Polly och IHttpClientFactoryhttps://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory
Polly (.NET-biblioteket för motståndskraft och övergående felhantering)https://github.com/App-vNext/Polly
Polly: Försök igen med Jitterhttps://github.com/App-vNext/Polly/wiki/Retry-with-jitter
Marc Brooker. Jitter: Göra saker bättre med slumpmässighet https://brooker.co.za/blog/2015/03/21/backoff.html