Dela via


Implementera ÅTERförsök för HTTP-anrop med exponentiell backoff med IHttpClientFactory- och Polly-principer

Dricks

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.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

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.

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-princip 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 filen Program.cs , som du ser i 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 du ser i föregående avsnitt måste du definiera en namngiven eller typad httpclientkonfiguration för klienten i din standardkonfiguration av Program.cs app. 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 och skalbarhet och under hög konkurrens. 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 medianinitierad inledande å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