Dela via


Implementera återförsök för HTTP-anrop med exponentiell backoff med IHttpClientFactory och Polly-policys

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.

Miniatyrbild av omslag för eBooken om .NET mikroservicearkitektur för containerbaserade .NET-applikationer.

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-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