Sdílet prostřednictvím


Úvod do vývoje odolných aplikací

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 key pro 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í:

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ří ServiceProvider z instance ServiceCollection.
  • Získá ResiliencePipelineProvider<string> od poskytovatele služeb.
  • Načte ResiliencePipeline z ResiliencePipelineProvider<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.

Další kroky