Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Tolerantie is de mogelijkheid van een app om te herstellen van tijdelijke fouten en te blijven functioneren. In de context van .NET-programmering wordt tolerantie bereikt door apps te ontwerpen die fouten probleemloos kunnen afhandelen en snel kunnen herstellen. Voor het bouwen van tolerante apps in .NET zijn de volgende twee pakketten beschikbaar op NuGet:
NuGet-pakket | Beschrijving |
---|---|
📦 Microsoft.Extensions.Resilience | Dit NuGet-pakket biedt mechanismen om apps te beveiligen tegen tijdelijke fouten. |
📦 Microsoft.Extensions.Http.Resilience | Dit NuGet-pakket biedt tolerantiemechanismen specifiek voor de HttpClient klasse. |
Deze twee NuGet-pakketten zijn gebouwd op Polly, een populair opensource-project. Polly is een .NET-tolerantie- en tijdelijke bibliotheek voor foutafhandeling waarmee ontwikkelaars strategieën kunnen uitdrukken, zoals opnieuw proberen, circuitonderbreker, time-out, isolatie van schotten, snelheidsbeperking, terugval en hedging op een vloeiende en thread-veilige manier.
Belangrijk
Het Microsoft.Extensions.Http.Polly NuGet-pakket is afgeschaft. Gebruik in plaats daarvan een van de bovengenoemde pakketten.
Aan de slag
Installeer het NuGet-pakket Microsoft.Extensions.Resilience om aan de slag te gaan met tolerantie in .NET.
dotnet add package Microsoft.Extensions.Resilience --version 8.0.0
Zie dotnet-pakket toevoegen of beheren van pakketafhankelijkheden in .NET-toepassingen voor meer informatie.
Een tolerantiepijplijn bouwen
Als u tolerantie wilt gebruiken, moet u eerst een pijplijn bouwen met strategieën op basis van tolerantie. Elke geconfigureerde strategie wordt uitgevoerd in volgorde van configuratie. Met andere woorden, volgorde is belangrijk. Het toegangspunt is een uitbreidingsmethode voor het IServiceCollection type, genaamd AddResiliencePipeline
. Deze methode gebruikt een id van de pijplijn en een gemachtigde die de pijplijn configureert. Aan de gedelegeerde wordt een instantie van ResiliencePipelineBuilder
doorgegeven, die wordt gebruikt om veerkrachtstrategieën toe te voegen aan de pijplijn.
Bekijk het volgende voorbeeld op basis van key
tekenreeksen:
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));
});
De voorgaande code:
- Hiermee maakt u een nieuw
ServiceCollection
-exemplaar. - Definieert een
key
om de pijplijn te identificeren. - Voegt een tolerantiepijplijn toe aan het
ServiceCollection
exemplaar. - Hiermee configureert u de pijplijn met een strategieën voor opnieuw proberen en time-outs.
Elke pijplijn wordt geconfigureerd voor een bepaalde key
, en elke key
pijplijn wordt gebruikt om de bijbehorende ResiliencePipeline
pijplijn te identificeren bij het ophalen van de pijplijn van de provider. Dit key
is een algemene typeparameter van de AddResiliencePipeline
methode.
Uitbreidingen voor opbouwfuncties van weerbaarheidspijplijnen
Als u een strategie aan de pijplijn wilt toevoegen, roept u een van de beschikbare Add*
extensiemethoden op het ResiliencePipelineBuilder
exemplaar aan.
-
AddRetry
: Probeer het opnieuw als er iets mislukt, wat handig is wanneer het probleem tijdelijk is en kan verdwijnen. -
AddCircuitBreaker
: Stop met proberen als iets kapot of bezet is, wat u helpt verspilde tijd en verslechtering te voorkomen. -
AddTimeout
: Geef op als iets te lang duurt, waardoor de prestaties kunnen worden verbeterd door resources vrij te maken. -
AddRateLimiter
: Beperk het aantal aanvragen dat u accepteert, zodat u de binnenkomende belasting kunt beheren. -
AddConcurrencyLimiter
: Beperk het aantal aanvragen dat u maakt, zodat u de uitgaande belasting kunt beheren. -
AddFallback
: Doe iets anders wanneer u fouten ondervindt, waardoor de gebruikerservaring wordt verbeterd. -
AddHedging
: Geef meerdere aanvragen op in het geval van hoge latentie of storing, waardoor de reactiesnelheid kan worden verbeterd.
Zie Tolerantiestrategieën voor meer informatie. Zie Voor voorbeelden tolerante HTTP-apps bouwen: Belangrijke ontwikkelingspatronen.
Verrijking van metrische gegevens
Verrijking is de automatische uitbreiding van telemetrie met een bekende toestand, in de vorm van naam- en waardeparen. Een app kan bijvoorbeeld een logboek verzenden dat de bewerking en resultaatcode bevat als kolommen om het resultaat van een bepaalde bewerking weer te geven. In deze situatie en afhankelijk van randapparatuurcontext voegt verrijking clusternaam, procesnaam, regio, tenant-id en meer toe aan het logboek terwijl deze naar de telemetrie-back-end wordt verzonden. Wanneer verrijking wordt toegevoegd, hoeft de app-code niets extra's te doen om te profiteren van verrijkte metrische gegevens.
Hoe verrijking werkt
Stel dat 1000 wereldwijd gedistribueerde service-exemplaren logboeken en metrische gegevens genereren. Wanneer u een probleem ondervindt op uw servicedashboard, is het van cruciaal belang om snel de problematische regio of het datacenter te identificeren. Verrijking zorgt ervoor dat metrische records de benodigde informatie bevatten om fouten in gedistribueerde systemen vast te stellen. Zonder verrijking valt de last op de app-code om deze status intern te beheren, te integreren in het logboekregistratieproces en deze handmatig te verzenden. Verrijking vereenvoudigt dit proces, zonder dat dit van invloed is op de logica van de app.
Wanneer u verrijking toevoegt, worden in het geval van tolerantie de volgende dimensies toegevoegd aan de uitgaande telemetrie:
-
error.type
: Versie met lage kardinaliteit van de gegevens van een uitzondering. -
request.name
: De naam van de aanvraag. -
request.dependency.name
: De naam van de afhankelijkheid.
Onder de motorkap is veerkrachtverrijking gebouwd op basis van Polly's Telemetry MeteringEnricher
. Voor meer informatie, zie Polly: Verrijking meten.
Tolerantieverrijking toevoegen
Naast het registreren van een tolerantiepijplijn kunt u ook tolerantieverrijking registreren. Als u verrijking wilt toevoegen, roept u de AddResilienceEnricher(IServiceCollection) uitbreidingsmethode op het IServiceCollection
exemplaar aan.
services.AddResilienceEnricher();
Door de AddResilienceEnricher
extensiemethode aan te roepen, voegt u dimensies toe boven op de standaarddimensies die zijn ingebouwd in de onderliggende Polly-bibliotheek. De volgende verrijkingsdimensies worden toegevoegd:
- Uitzonderingsverrijking op basis van de IExceptionSummarizer, die een mechanisme biedt voor het samenvatten van uitzonderingen voor gebruik in telemetrie. Zie Uitzonderingssamenvatting voor meer informatie.
- Verrijking van metagegevens aanvragen op basis van RequestMetadata, die de metagegevens van het verzoek voor telemetrie bevat. Zie Polly: Metrische telemetriegegevens voor meer informatie.
Tolerantiepijplijn gebruiken
Als u een geconfigureerde veerkrachtpijplijn wilt gebruiken, moet u de pijplijn ophalen uit een ResiliencePipelineProvider<TKey>
. Toen u eerder de pijplijn hebt toegevoegd, had key
het type string
, dus moet u de pijplijn uit de ResiliencePipelineProvider<string>
halen.
using ServiceProvider provider = services.BuildServiceProvider();
ResiliencePipelineProvider<string> pipelineProvider =
provider.GetRequiredService<ResiliencePipelineProvider<string>>();
ResiliencePipeline pipeline = pipelineProvider.GetPipeline(key);
De voorgaande code:
- Hiermee wordt een
ServiceProvider
van deServiceCollection
instantie gebouwd. - Hiermee haalt u de
ResiliencePipelineProvider<string>
van de serviceprovider op. - Haalt de
ResiliencePipeline
uit deResiliencePipelineProvider<string>
.
Tolerantiepijplijn uitvoeren
Als u de tolerantiepijplijn wilt gebruiken, roept u een van de beschikbare Execute*
methoden op het ResiliencePipeline
exemplaar aan. Denk bijvoorbeeld aan een voorbeeld van een aanroep naar ExecuteAsync
methode:
await pipeline.ExecuteAsync(static cancellationToken =>
{
// Code that could potentially fail.
return ValueTask.CompletedTask;
});
In de voorgaande code wordt de delegate binnen de ExecuteAsync
-methode uitgevoerd. Wanneer er fouten optreden, worden de geconfigureerde strategieën uitgevoerd. Als de delegatie code bijvoorbeeld is geconfigureerd om drie keer opnieuw te proberen, wordt het stukje code vier keer uitgevoerd (één initiële poging plus drie herhaalde pogingen) voordat de fout wordt doorgegeven.