Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Aanbeveling
Deze inhoud is een fragment uit het eBook, .NET Microservices Architecture for Containerized .NET Applications, beschikbaar op .NET Docs of als een gratis downloadbare PDF die offline kan worden gelezen.
De aanbevolen aanpak voor nieuwe pogingen met exponentieel uitstel is om te profiteren van meer geavanceerde .NET-bibliotheken, zoals de opensource Polly-bibliotheek.
Polly is een .NET-bibliotheek die mogelijkheden biedt voor tolerantie en tijdelijke foutafhandeling. U kunt deze mogelijkheden implementeren door Polly-beleid toe te passen, zoals Herhaal, Stroomonderbreker, Schottenisolatie, Time-out en Reservestrategie. Polly is gericht op .NET Framework 4.x en .NET Standard 1.0, 1.1 en 2.0 (die .NET Core en hoger ondersteunt).
De volgende stappen laten zien hoe u Http-retries kunt gebruiken met Polly geïntegreerd in IHttpClientFactory, zoals uitgelegd in de vorige sectie.
.NET-pakketten installeren
Eerst moet u het Microsoft.Extensions.Http.Polly pakket installeren.
- Installeren met Visual Studio
- Installeren met dotnet CLI
- Installeren met nuget.exe CLI
- Installeren met Package Manager Console (PowerShell)
Verwijzen naar de .NET 8-pakketten
IHttpClientFactory is beschikbaar sinds .NET Core 2.1, maar we raden u aan de nieuwste .NET 8-pakketten van NuGet in uw project te gebruiken. Meestal moet u ook verwijzen naar het extensiepakket Microsoft.Extensions.Http.Polly.
Een client configureren met beleid voor opnieuw proberen van Polly bij het opstarten van de app
De methode AddPolicyHandler() voegt beleidsregels toe aan de HttpClient objecten die u gaat gebruiken. In dit geval voegt het Polly's beleid toe voor HTTP-pogingen met exponentiële terugval.
Als u een meer modulaire benadering wilt hebben, kan de Http Retry Policy worden gedefinieerd in een afzonderlijke methode binnen het Program.cs-bestand, zoals wordt weergegeven in de volgende code:
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
retryAttempt)));
}
Zoals wordt weergegeven in de vorige secties, moet u een benoemde of getypte HttpClient-configuratie definiëren in uw standaard-Program.cs-app-configuratie . Nu voegt u stapsgewijze code toe die het beleid voor de HTTP-herhaalpogingen met exponentieel toenemende wachttijd opgeeft, als volgt:
// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
.SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Set lifetime to five minutes
.AddPolicyHandler(GetRetryPolicy());
Met Polly kunt u een beleid voor opnieuw proberen definiëren met het aantal nieuwe pogingen, de exponentiële uitstelconfiguratie en de acties die moeten worden uitgevoerd wanneer er een HTTP-uitzondering is, zoals het vastleggen van de fout. In dit geval is het beleid geconfigureerd om zes keer te proberen met een exponentiële nieuwe poging, beginnend bij twee seconden.
Een jitter-strategie toevoegen aan het beleid voor opnieuw proberen
Een standaard retry-beleid kan van invloed zijn op uw systeem in situaties van hoge gelijktijdigheid en schaalbaarheid en bij hoge belasting. Om pieken van vergelijkbare nieuwe pogingen te overwinnen die afkomstig zijn van veel clients in gedeeltelijke storingen, is een goede tijdelijke oplossing om een jitter-strategie toe te voegen aan het algoritme/beleid voor opnieuw proberen. Deze strategie kan de algehele prestaties van het end-to-end systeem verbeteren. Zoals aanbevolen in Polly: Opnieuw proberen met Jitter, kan een goede jitter-strategie worden geïmplementeerd door vloeiende en gelijkmatig verdeelde intervallen voor opnieuw proberen toe te passen, met een goed gecontroleerde mediaan initiële wachttijd en een exponentieel uitstel. Deze aanpak helpt bij het uitspreiden van de pieken wanneer het probleem zich voordoet. Het principe wordt geïllustreerd in het volgende voorbeeld:
var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);
var retryPolicy = Policy
.Handle<FooException>()
.WaitAndRetryAsync(delay);
Aanvullende bronnen
Patroon voor opnieuw proberenhttps://free.blessedness.top/azure/architecture/patterns/retry
Polly en IHttpClientFactoryhttps://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory
Polly (.NET veerkracht en bibliotheek voor het omgaan met tijdelijke storingen)https://github.com/App-vNext/Polly
Polly: Opnieuw proberen met Jitterhttps://github.com/App-vNext/Polly/wiki/Retry-with-jitter
Marc Brooker. Jitter: Dingen beter maken met willekeurigheid https://brooker.co.za/blog/2015/03/21/backoff.html