Megosztás a következőn keresztül:


HTTP-hívás-újrapróbálkozások implementálása exponenciális visszalépéssel az IHttpClientFactory és a Polly szabályzatokkal

Jótanács

Ez a tartalom egy részlet a '.NET Microservices Architecture for Containerized .NET Applications' című eBook-ból, amely elérhető a .NET Docs oldalon, vagy ingyenesen letölthető PDF formátumban, amely offline módban is olvasható.

.NET mikroszolgáltatások architektúrája konténerizált .NET alkalmazásokhoz e-könyv borító miniatűr.

Az exponenciális visszalépéssel végzett újrapróbálkozások ajánlott módszere a fejlettebb .NET-kódtárak, például a nyílt forráskódú Polly-kódtárak kihasználása.

A Polly egy .NET-kódtár, amely rugalmasságot és átmeneti hibakezelési képességeket biztosít. Ezeket a képességeket olyan Polly-szabályzatok alkalmazásával valósíthatja meg, mint az Újrapróbálkozás, az Áramkör-megszakító, a Válaszfal izoláció, az Időtúllépés és a Tartalék. A Polly a .NET Framework 4.x és a .NET Standard 1.0, 1.1 és 2.0 verziót célozza meg (amely támogatja a .NET Core-t és újabb verziót).

Az alábbi lépések bemutatják, hogyan használhatja a Http-visszaküldéseket a Polly integrálásával IHttpClientFactory, amelyet az előző szakasz tárgyal.

.NET-csomagok telepítése

Először telepítenie kell a Microsoft.Extensions.Http.Polly csomagot.

Hivatkozás a .NET 8-csomagokra

IHttpClientFactory a .NET Core 2.1 óta érhető el, azonban javasoljuk, hogy a nuGet legújabb .NET 8 csomagjait használja a projektben. Általában a bővítménycsomagra Microsoft.Extensions.Http.Pollyis hivatkoznia kell.

Ügyfél konfigurálása a Polly Újrapróbálkozás szabályzatával az alkalmazás indításakor

Az AddPolicyHandler() metódus az, amely szabályzatokat ad hozzá a HttpClient használni kívánt objektumokhoz. Ebben az esetben egy Polly által alkalmazott stratégia adódik hozzá a HTTP kérésekhez, amely exponenciális késleltetést alkalmaz az újrapróbálkozások során.

A modulárisabb megközelítés érdekében a Http Újrapróbálkozási szabályzat a Program.cs fájlon belül egy külön metódusban határozható meg, ahogyan az a következő kódban látható:

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
        .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
                                                                    retryAttempt)));
}

Ahogy az előző szakaszokban is látható, egy elnevezett vagy beírt ügyfél httpClient-konfigurációját kell definiálnia a standard Program.cs alkalmazáskonfigurációban. Most adja hozzá az alábbiak szerint a HTTP-újrapróbálkozások szabályzatát meghatározó növekményes kódot exponenciális visszalépéssel:

// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
        .SetHandlerLifetime(TimeSpan.FromMinutes(5))  //Set lifetime to five minutes
        .AddPolicyHandler(GetRetryPolicy());

A Polly használatával újrapróbálkozási szabályzatot határozhat meg az újrapróbálkozási műveletek számával, az exponenciális háttérkonfigurációval és a HTTP-kivétel esetén végrehajtandó műveletekkel, például a hiba naplózásával. Ebben az esetben a szabályzat úgy van konfigurálva, hogy hatszor próbálkozzon exponenciális újrapróbálkozással, két másodperctől kezdve.

Adjunk hozzá egy jitter-stratégiát az újrapróbálási szabályzathoz

A rendszeres újrapróbálkozási szabályzatok nagy egyidejűség és skálázhatóság esetén és nagy versengés esetén befolyásolhatják a rendszert. Ha több ügyféltől származó hasonló újrapróbálkozások csúcsait szeretné leküzdeni részleges kimaradások esetén, jó megoldás, ha jitter stratégiát ad hozzá az újrapróbálkozási algoritmushoz/szabályzathoz. Ez a stratégia javíthatja a teljes körű rendszer általános teljesítményét. A Polly: Újrapróbálkozás Jitterrel című szakasza szerint a jó jitter-stratégia zökkenőmentes és egyenletesen elosztott újrapróbálkozási időközökkel valósítható meg, amelyek megfelelően szabályozott medián kezdeti újrapróbálkozási késleltetéssel, exponenciális visszalépéskor lépnek érvénybe. Ez a megközelítés segít eloszlatni a kiugró csúcsokat a probléma felmerülésekor. Az alapelvet az alábbi példa szemlélteti:


var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);

var retryPolicy = Policy
    .Handle<FooException>()
    .WaitAndRetryAsync(delay);

További erőforrások