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.
Odolnost je schopnost aplikace zotavit se z přechodných selhání a nadále fungovat. V kontextu programování rozhraní .NET se odolnost dosahuje návrhem aplikací, které dokážou řádně zvládnout selhání a rychle se zotavit. Aby bylo možné vytvářet odolné aplikace v .NET, jsou na NuGetu k dispozici následující dva balíčky:
| Balíček NuGet | Popis |
|---|---|
| 📦 Microsoft.Extensions.Resilience | Tento balíček NuGet poskytuje mechanismy pro posílení zabezpečení aplikací proti přechodným selháním. |
| 📦 Microsoft.Extensions.Http.Resilience | Tento balíček NuGet poskytuje mechanismy odolnosti speciálně pro HttpClient třídu. |
Tyto dva balíčky NuGet jsou postavené na Polly, což je oblíbený opensourcový projekt. Polly je knihovna pro odolnost a zpracování přechodných chyb v .NET, která vývojářům umožňuje vyjádřit strategie, jako je opakování, jistič, vypršení časového limitu, izolace přepážky, omezování rychlosti, záložní a krytí plynulým a bezpečným způsobem pro vlákna.
Důležité
Balíček NuGet Microsoft.Extensions.Http.Polly je zastaralý. Místo toho použijte některý z výše uvedených balíčků.
Začínáme
Pokud chcete začít s odolností v .NET, nainstalujte balíček NuGet Microsoft.Extensions.Resilience .
dotnet add package Microsoft.Extensions.Resilience
Další informace naleznete v tématu dotnet package add nebo Správa závislostí balíčků v aplikacích .NET.
Vytvořte systém odolnosti
Pokud chcete používat odolnost, musíte nejprve vytvořit kanál strategií založených na odolnosti. Každá nakonfigurovaná strategie se spouští v pořadí konfigurace. Jinými slovy, pořadí je důležité. Vstupní bod je rozšiřující metoda typu IServiceCollection s názvem AddResiliencePipeline. Tato metoda přebírá identifikátor kanálu a delegáta, který konfiguruje kanál. Delegátovi se předá instance ResiliencePipelineBuilder, která se používá k přidání strategií odolnosti do kanálu.
Představte si následující příklad založený na key řetězci:
using Microsoft.Extensions.DependencyInjection;
using Polly;
using Polly.CircuitBreaker;
using Polly.Registry;
using Polly.Retry;
using Polly.Timeout;
var services = new ServiceCollection();
const string key = "Retry-Timeout";
services.AddResiliencePipeline(key, static builder =>
{
// See: https://www.pollydocs.org/strategies/retry.html
builder.AddRetry(new RetryStrategyOptions
{
ShouldHandle = new PredicateBuilder().Handle<TimeoutRejectedException>()
});
// See: https://www.pollydocs.org/strategies/timeout.html
builder.AddTimeout(TimeSpan.FromSeconds(1.5));
});
Předchozí kód:
- Vytvoří novou instanci
ServiceCollection. - Definuje
keypro identifikaci pipeline. - Přidá kanál odolnosti do instance
ServiceCollection. - Ponastavuje pipeline se strategiemi opakování a časového limitu.
Každý pipeline je nakonfigurovaný pro danou key, a každý key je použit k identifikaci odpovídajícího ResiliencePipeline při získávání pipeline od poskytovatele. Jedná se key o parametr AddResiliencePipeline obecného typu metody.
Rozšíření návrháře modulu pro odolnost systémů
Pokud chcete do kanálu přidat strategii, zavolejte některou z dostupných Add* metod rozšíření v ResiliencePipelineBuilder instanci.
-
AddRetry: Zkuste to znovu, pokud se něco nepovede, což je užitečné, když je problém dočasný a může jít pryč. -
AddCircuitBreaker: Přestaňte se snažit, pokud je něco přerušené nebo zaneprázdněno, což vám přináší výhody tím, že se vyhnete plýtvání časem a nezhoršíte věci. -
AddTimeout: Vzdát se, pokud něco trvá příliš dlouho, což může zlepšit výkon uvolněním prostředků. -
AddRateLimiter: Omezte počet žádostí, které přijmete, což umožňuje řídit příchozí zatížení. -
AddConcurrencyLimiter: Omezte počet požadavků, které provedete, což umožňuje řídit odchozí zatížení. -
AddFallback: V případě selhání udělejte něco jiného, což zlepšuje uživatelské prostředí. -
AddHedging: V případě vysoké latence nebo selhání vyřešte několik požadavků, což může zlepšit rychlost odezvy.
Další informace naleznete v tématu Strategie odolnosti. Příklady najdete v tématu Vytváření odolných aplikací HTTP: Klíčové vývojové vzory.
Rozšiřování metrik
Obohacení je automatické rozšíření telemetrie o dobře známé stavy ve formě párů název/hodnota. Aplikace může například generovat protokol, který obsahuje operaci a kód výsledku jako sloupce, aby představoval výsledek určité operace. V této situaci a v závislosti na periferním kontextu přidá rozšíření název clusteru, název procesu, oblast, ID tenanta a další položky do protokolu při odesílání do back-endu telemetrie. Když přidáte rozšiřování, kód aplikace nemusí dělat nic navíc, aby bylo možné využívat rozšířené metriky.
Jak funguje obohacení
Představte si 1 000 globálně distribuovaných instancí služeb, které generují protokoly a metriky. Když na řídicím panelu služby narazíte na problém, je důležité rychle identifikovat problematickou oblast nebo datové centrum. Rozšiřování zajišťuje, aby záznamy metrik obsahovaly potřebné informace pro určení chyb v distribuovaných systémech. Bez rozšiřování zátěž spadá na kód aplikace, který musí interně spravovat tento stav, integrovat ho do procesu protokolování a ručně ho přenášet. Rozšiřování zjednodušuje tento proces, bezproblémově ho zpracovává, aniž by to mělo vliv na logiku aplikace.
V případě odolnosti se při přidání rozšíření do odchozí telemetrie přidají následující dimenze:
-
error.type: Verze informace o výjimce s nízkou kardinalitou. -
request.name: Název požadavku. -
request.dependency.name: Název závislosti.
Pod pokrývkami je obohacení odolnosti postaveno na telemetrii PollyMeteringEnricher. Další informace najdete v tématu Polly: Rozšiřování měření.
Přidání posílení odolnosti
Kromě registrace kanálu odolnosti můžete také zaregistrovat rozšiřování odolnosti. Chcete-li přidat rozšiřování, zavolejte metodu AddResilienceEnricher(IServiceCollection) rozšíření v IServiceCollection instanci.
services.AddResilienceEnricher();
Voláním AddResilienceEnricher metody rozšíření přidáváte dimenze nad výchozí dimenze, které jsou integrované do podkladové knihovny Polly. Přidají se následující dimenze rozšiřování:
- Rozšiřování výjimek na základě IExceptionSummarizer, který poskytuje mechanismus pro shrnutí výjimek pro použití v telemetrii. Další informace najdete v tématu Souhrn výjimek.
- Požádejte o obohacení metadat na základě RequestMetadata, které obsahuje metadata požadavku pro telemetrii. Další informace najdete v tématu Polly: Telemetrické metriky.
Použijte tok odolnosti
Pokud chcete použít nakonfigurovaný kanál odolnosti, musíte kanál získat z objektu ResiliencePipelineProvider<TKey>. Když jste dříve přidali kanál, byl key typu string, takže musíte získat kanál z ResiliencePipelineProvider<string>.
using ServiceProvider provider = services.BuildServiceProvider();
ResiliencePipelineProvider<string> pipelineProvider =
provider.GetRequiredService<ResiliencePipelineProvider<string>>();
ResiliencePipeline pipeline = pipelineProvider.GetPipeline(key);
Předchozí kód:
- Vytvoří
ServiceProviderz instanceServiceCollection. - Získá
ResiliencePipelineProvider<string>od poskytovatele služeb. - Načte
ResiliencePipelinezResiliencePipelineProvider<string>.
Spuštění kanálu odolnosti
Pokud chcete použít kanál odolnosti, zavolejte některou z dostupných Execute* metod v ResiliencePipeline instanci. Představte si například příklad volání ExecuteAsync metody:
await pipeline.ExecuteAsync(static cancellationToken =>
{
// Code that could potentially fail.
return ValueTask.CompletedTask;
});
Předchozí kód spustí delegáta ExecuteAsync v rámci metody. Pokud dojde k selháním, spustí se nakonfigurované strategie. Pokud je například RetryStrategy nakonfigurováno tak, aby se opakovalo třikrát, delegát se spustí čtyřikrát (jeden počáteční pokus plus tři pokusy o opakování), než se selhání propaguje.