Delen via


HTTP-aanroepherhaling implementeren met exponentieel uitstel met IHttpClientFactory- en Polly-beleid

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.

.NET Microservices Architectuur voor Gecontaineriseerde .NET Toepassingen eBook omslagthumbnail.

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.

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