Delen via


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

Tip

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 Architecture for Containerized .NET Applications eBook cover thumbnail.

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 Opnieuw proberen, Circuitonderbreker, Isolatie van schotten, Time-out en Terugval. 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-nieuwe pogingen kunt gebruiken met Polly geïntegreerd IHttpClientFactoryin, wat wordt 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 beleid van Polly toe voor Http Retries met exponentieel uitstel.

Als u een meer modulaire benadering wilt hebben, kan het Beleid voor opnieuw proberen 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 in de vorige secties wordt weergegeven, moet u een benoemde of getypte httpClient-configuratie definiëren in de standaard-Program.cs-app-configuratie. Nu voegt u incrementele code toe die het beleid voor de HTTP-nieuwe pogingen met exponentieel uitstel 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 regelmatig beleid voor opnieuw proberen kan van invloed zijn op uw systeem in gevallen van hoge gelijktijdigheid en schaalbaarheid en onder hoge conflicten. 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 die worden toegepast met een goed gecontroleerde mediaan initiële vertraging voor opnieuw proberen op 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