Toepassingstolerantie implementeren

Voltooid

De tolerantiefuncties van .NET zijn gebaseerd op het Polly-project en beschikbaar gesteld via Microsoft.Extensions. U kunt een standaardtolerantiestrategie toevoegen die gebruikmaakt van verstandige standaardwaarden door één regel code toe te voegen aan uw app.

Tolerantie toevoegen aan uw app

Als u tolerantie wilt toevoegen aan een app die is gebouwd met behulp van een microservicesarchitectuur, voert u de volgende stappen uit met behulp van HTTP-aanvragen tussen afzonderlijke services:

  1. Voeg het Microsoft.Extensions.Http.Resilience pakket toe aan uw project.
  2. Voeg een tolerantiehandler toe aan uw HttpClient-serviceaanroepen.
  3. Configureer de tolerantiestrategie.

Het NuGet-pakket toevoegen aan uw project

Voer de volgende opdracht uit om het NuGet-pakket voor tolerantie toe te voegen:

dotnet add package Microsoft.Extensions.Http.Resilience

Als u deze opdracht uitvoert vanuit de terminal in de projectmap van de app, wordt de pakketreferentie toegevoegd aan het projectbestand.

Voeg in de opstartklasse van uw toepassing de volgende using-instructie toe:

using Microsoft.Extensions.Http.Resilience;

Een tolerantiestrategie toevoegen

U kunt nu een standaardtolerantiestrategie toevoegen aan uw HttpClient-service. .NET biedt deze out-of-the-box-configuratie die een aantal strategieën combineert.

A diagram showing the strategies included in the Standard Resilience Handler. From overall timeout, retry, bulkhead, circuit breaker, and attempt timeout.

De aanvraaghandler doorloopt elk van de bovenstaande strategieën in volgorde van links naar rechts:

  • Totale time-outstrategie voor aanvragen: Hiermee stelt u een totale hoeveelheid tijd in die de aanvraag kan duren. U kunt dit zien als het instellen van de bovengrens voor alle andere strategieën.
  • Strategie voor opnieuw proberen: deze strategie bepaalt de opties voor het aantal nieuwe pogingen, uitstel en jitter. Deze opties kunnen de totale time-out die in de vorige strategie is ingesteld, niet overschrijden.
  • Circuitonderbrekerstrategie: Met deze strategie wordt het circuit geopend als de foutverhouding de drempelwaarde overschrijdt.
  • Time-outstrategie voor pogingen: met deze strategie wordt een time-out ingesteld voor elke afzonderlijke aanvraag. Als de aanvraag langer duurt dan deze tijd, wordt er een uitzondering gegenereerd.

U kunt deze standaardstrategie met alle standaardwaarden toevoegen door deze extensiemethode toe te voegen:

.AddStandardResilienceHandler();

Als u bijvoorbeeld een WebApplicationtolerantiestrategie hebt gedeclareerd en u een tolerantiestrategie wilt toevoegen aan de HttpClient-service, gebruikt u deze code:

builder.Services.AddHttpClient<ServiceBeingCalled>(httpClient =>
{
    httpClient.BaseAddress = new Uri("https://service.endpoint/");
}).AddStandardResilienceHandler();

Met de eerste regel van de bovenstaande code wordt een standaardtolerantiehandler toegevoegd aan de HTTPClient. Hiermee worden alle standaardinstellingen gebruikt voor de strategieën voor opnieuw proberen en circuitonderbrekers.

De tolerantiestrategie configureren

U kunt de standaardwaarden van een van de strategieën wijzigen door nieuwe opties op te geven, bijvoorbeeld:

.AddStandardResilienceHandler( options => 
{  
    options.RetryOptions.RetryCount = 10;
    options.RetryOptions.BaseDelay = TimeSpan.FromSeconds(1);
});

Met deze code wordt de standaardinstelling voor opnieuw proberen gewijzigd dat er maximaal 10 buiten gebruik wordt gesteld, om een lineaire back-off te gebruiken en een basisvertraging van 1 seconde te gebruiken.

De opties die u kiest, moeten compatibel zijn met elkaar. Als de totale tijd bijvoorbeeld blijft staan als de standaardwaarde van 30 seconden, veroorzaken de bovenstaande opties voor opnieuw proberen een uitzondering. Dit is een fout omdat de exponentiële uitstelinstelling ertoe zou leiden dat de totale tijd voor het voltooien van de 10 nieuwe pogingen 2046 seconden zou zijn. Dit is een runtime-uitzondering, geen compilatietijdfout.

De volgende tabel bevat de opties die beschikbaar zijn voor elk van de strategieën.

Totale time-outopties voor aanvragen Omschrijving
TotalTimeout De totale hoeveelheid tijd die de aanvraag kan duren. De standaardwaarde is 30 seconden.
OnTimeout Een callback-functie die wordt aangeroepen wanneer er een time-out optreedt voor de aanvraag. De standaardwaarde is null.

Opties voor nieuw pogingen Omschrijving
RetryCount Het maximum aantal nieuwe pogingen. De standaardwaarde is 3.
BackoffType Het type uitstel dat moet worden gebruikt. U kunt kiezen tussen lineair en exponentieel. De standaardwaarde is exponentieel.
UseJitter Of jitter moet worden toegevoegd aan de back-off. Jitter voegt willekeurigheid toe aan de vertraging om pieken in de belasting te verminderen. De standaardwaarde is waar.
BaseDelay De vertraging tussen nieuwe pogingen. De standaardwaarde is 2 seconden.

Opties voor circuitonderbreker Omschrijving
BreakDuration De duur van het circuitonderbreker. De standaardwaarde is 5 seconden.
FailureRatio De verhouding tussen mislukte aanvragen en geslaagde aanvragen waarmee het circuit wordt geopend. De standaardwaarde is 0.1.
SamplingDuration De duur van de tijd waarop de foutverhouding wordt berekend. De standaardwaarde is 30 seconden.
OnClosed Een callback-functie die wordt aangeroepen wanneer het circuit wordt gesloten. De standaardwaarde is null.
OnHalfOpened Een callback-functie die wordt aangeroepen wanneer het circuit halfopen is. De standaardwaarde is null.
OnOpened Een callback-functie die wordt aangeroepen wanneer het circuit wordt geopend. De standaardwaarde is null.

Time-outopties voor poging Omschrijving
Timeout De hoeveelheid tijd die de aanvraag kan duren. De standaardwaarde is 2 seconden.
OnTimeout Een callback-functie die wordt aangeroepen wanneer er een time-out optreedt voor de aanvraag. De standaardwaarde is null.

A sequence diagram showing the flow of events in an application using a resiliency strategy.

In het bovenstaande sequentiediagram ziet u hoe elk van de strategieën samenwerken in een standaardtolerantiestrategie. Om te beginnen met de beperkende factor van hoe lang een aanvraag kan duren, wordt bepaald door de totale time-outstrategie. De strategie voor opnieuw proberen moet vervolgens worden ingesteld op een maximum aantal nieuwe pogingen dat binnen de totale time-out wordt voltooid. De circuitonderbrekerstrategie opent het circuit als de foutverhouding de drempelwaarde overschrijdt die hiervoor is ingesteld. De time-outstrategie voor pogingen stelt een time-out in voor elke afzonderlijke aanvraag. Als de aanvraag langer duurt dan deze tijd, wordt er een uitzondering gegenereerd.