Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Návod
Tento obsah je výňatek z eBooku, architektury mikroslužeb .NET pro kontejnerizované aplikace .NET, které jsou k dispozici na .NET Docs nebo jako zdarma ke stažení PDF, které lze číst offline.
Doporučeným přístupem pro opakování s exponenciálním zpožováním je využít pokročilejší knihovny .NET, jako je opensourcová knihovna Polly.
Polly je knihovna .NET, která poskytuje možnosti odolnosti a zpracování přechodných chyb. Tyto funkce můžete implementovat použitím zásad Polly, jako jsou pokus o opakování (Retry), jistič, oddělení bulkhead, vypršení časového limitu a náhradní strategie. Polly cílí na rozhraní .NET Framework 4.x a .NET Standard 1.0, 1.1 a 2.0 (což podporuje .NET Core a novější).
Následující kroky ukazují, jak můžete použít opakování HTTP s Polly integrovaným do IHttpClientFactory, což je vysvětleno v předchozí části.
Instalace balíčků .NET
Nejprve budete muset balíček nainstalovat Microsoft.Extensions.Http.Polly .
- Instalace pomocí sady Visual Studio
- Instalace pomocí rozhraní příkazového řádku dotnet
- Instalace pomocí rozhraní příkazového řádku nuget.exe
- Instalace pomocí konzoly Správce balíčků (PowerShell)
Odkaz na balíčky .NET 8
IHttpClientFactory je k dispozici od verze .NET Core 2.1, ale ve svém projektu doporučujeme používat nejnovější balíčky .NET 8 z NuGetu. Obvykle také potřebujete odkazovat na balíček s rozšířením Microsoft.Extensions.Http.Polly.
Konfigurace klienta pomocí zásad opakování Polly při spuštění aplikace
Metoda AddPolicyHandler() je to, co přidává zásady do HttpClient objektů, které použijete. V tomto případě přidává politiku Polly pro opakované pokusy HTTP s exponenciálním odkladem.
Pokud chcete mít modulární přístup, může být zásada opakování Http definována v samostatné metodě v souboru Program.cs , jak je znázorněno v následujícím kódu:
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
retryAttempt)));
}
Jak je znázorněno v předchozích částech, musíte definovat pojmenovanou nebo typovanou konfiguraci klienta HttpClient ve standardní konfiguraci aplikace Program.cs . Teď přidáte postupně kód určující zásadu pro opakované pokusy HTTP s exponenciálním zpětným odezvy takto:
// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
.SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Set lifetime to five minutes
.AddPolicyHandler(GetRetryPolicy());
Pomocí Polly můžete definovat politiku opakování s počtem opakování, konfigurací exponenciálního zpoždění a akcemi, které se mají provést, když dojde k HTTP výjimce, například zalogovat chybu. V tomto případě je politika nakonfigurovaná tak, aby se pokusila znovu šestkrát s exponenciálním nárůstem doby mezi pokusy, počínaje dvěma sekundami.
Přidejte strategii jitteru do zásad pro opakování.
Běžné zásady opakování můžou ovlivnit váš systém v případech vysoké souběžnosti a škálovatelnosti a v případě vysokého kolizí. Pokud chcete překonat špičky podobných opakovaných pokusů pocházejících z mnoha klientů v částečných výpadcích, je dobrým řešením přidat do algoritmu nebo zásad opakování náhodnou strategii. Tato strategie může zlepšit celkový výkon komplexního systému. Jak se doporučuje v Polly: Opakování s jitterem, dobrou strategii jitteru je možné implementovat hladkými a rovnoměrně distribuovanými intervaly pokusů s dobře řízeným mediánem počátečního zpoždění opakování s exponenciálním stupňováním. Tento přístup pomáhá rozložit špičky, když nastane problém. Princip je ilustrován následujícím příkladem:
var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);
var retryPolicy = Policy
.Handle<FooException>()
.WaitAndRetryAsync(delay);
Dodatečné zdroje
Vzor opakováníhttps://learn.microsoft.com/azure/architecture/patterns/retry
Polly a IHttpClientFactoryhttps://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory
Polly (odolnost rozhraní .NET a knihovna pro zpracování přechodných chyb)https://github.com/App-vNext/Polly
Polly: Opakování s jitteremhttps://github.com/App-vNext/Polly/wiki/Retry-with-jitter
Marc Brooker. Jitter: Vylepšení věcí pomocí náhodnosti https://brooker.co.za/blog/2015/03/21/backoff.html