HTTP-hívás-újrapróbálkozások implementálása exponenciális visszalépéssel az IHttpClientFactory és a Polly szabályzatokkal
Tipp.
Ez a tartalom egy részlet a .NET-alkalmazásokhoz készült .NET-alkalmazásokhoz készült eBook, .NET Microservices Architecture című eBookból, amely elérhető a .NET Docs-on vagy egy ingyenesen letölthető PDF-fájlként, amely offline módban is olvasható.
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, a Megszakító, a Válaszfal elkülönítése, az Időtúllépés és a Tartalék. A Polly .NET-keretrendszer 4.x és .NET Standard 1.0, 1.1 és 2.0 (amely támogatja a .NET Core-t és újabb verziót).
Az alábbi lépések bemutatják, hogyan használhatja a Http-újrapróbálkozásokat a Polly integrálva IHttpClientFactory
, ami az előző szakaszban található.
.NET-csomagok telepítése
Először telepítenie kell a Microsoft.Extensions.Http.Polly
csomagot.
- Telepítés a Visual Studióval
- Telepítés a dotnet parancssori felületével
- Telepítés nuget.exe parancssori felülettel
- Telepítés Csomagkezelő konzollal (PowerShell)
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.Polly
is 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-szabályzatot ad hozzá a Http-újrapróbálkozáshoz exponenciális visszalépéssel.
A modulárisabb megközelítés érdekében a Http Újrapróbálkozási szabályzat egy külön metódusban definiálható a Program.cs fájlban, 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ó, meg kell határoznia egy elnevezett vagy beírt ügyfél HttpClient-konfigurációját a standard Program.cs alkalmazáskonfigurációban. Most adja hozzá a http-újrapróbálkozások szabályzatát exponenciális visszalépéssel megadó növekményes kódot az alábbiak szerint:
// 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.
Jitter-stratégia hozzáadása az újrapróbálkozé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
Újrapróbálkozási mintahttps://learn.microsoft.com/azure/architecture/patterns/retry
Polly és IHttpClientFactoryhttps://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory
Polly (.NET rugalmasság és átmeneti hibakezelési kódtár)https://github.com/App-vNext/Polly
Polly: Újrapróbálkozás Jitterrelhttps://github.com/App-vNext/Polly/wiki/Retry-with-jitter
Marc Brooker. Jitter: Így a dolgok jobb véletlenszerűséggel https://brooker.co.za/blog/2015/03/21/backoff.html
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: