Implementace opakování volání HTTP s exponenciálním zpochybováním pomocí zásad IHttpClientFactory a Polly

Tip

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.

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

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 opakování, jistič, izolace bulkheadů, vypršení časového limitu a náhradního použití. 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 .

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 Microsoft.Extensions.Http.Pollyrozšíření .

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á zásady Polly pro opakování http s exponenciálním zpochybněním.

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 konfiguraci HttpClient klienta s názvem nebo typem ve standardní konfiguraci aplikace Program.cs . Teď přidáte přírůstkový kód určující zásadu pro opakování http s exponenciálním zpožďováním následujícím způsobem:

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

Pomocí Polly můžete definovat zásadu opakování s počtem opakování, exponenciální konfigurací zpětného ukončení a akcemi, které se mají provést, když dojde k výjimce HTTP, například protokolování chyby. V tomto případě je zásada nakonfigurovaná tak, aby zkusila šestkrát s exponenciálním opakováním počínaje dvěma sekundami.

Přidání strategie opakování do zásad 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ýpadkech, je dobrým alternativním řešením přidat do algoritmu nebo zásad opakování strategii zpoždění. 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ým a rovnoměrně distribuovanými intervaly opakování s dobře řízeným mediánem počátečního opakování zpoždění v exponenciálním zpomalování. Tento přístup pomáhá rozložit špičky v případě vzniku problému. 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);

Další materiály