Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Tipp
Dieser Inhalt ist ein Auszug aus dem eBook .NET Microservices Architecture for Containerized .NET Applications, verfügbar auf .NET Docs oder als kostenlose herunterladbare PDF, die offline gelesen werden kann.
Der empfohlene Ansatz für Wiederholungen mit exponentiellem Backoff besteht darin, erweiterte .NET-Bibliotheken wie die Open-Source-Polly-Bibliothek zu nutzen.
Polly ist eine .NET-Bibliothek, die Resilienz- und Vorübergehende Fehlerbehandlungsfunktionen bereitstellt. Sie können diese Funktionen implementieren, indem Sie Polly-Richtlinien wie Retry, Circuit Breaker, Bulkhead Isolation, Timeout und Fallback anwenden. Polly zielt auf .NET Framework 4.x und .NET Standard 1.0, 1.1 und 2.0 (die .NET Core und höher unterstützt).
Die folgenden Schritte zeigen, wie Sie HTTP-Wiederholungen mit Polly, integriert in IHttpClientFactory
, verwenden können, was im vorherigen Abschnitt erläutert wird.
Installieren von .NET-Paketen
Zuerst müssen Sie das Microsoft.Extensions.Http.Polly
Paket installieren.
- Installieren mit Visual Studio
- Installieren mit dotnet CLI
- Installieren mit nuget.exe CLI
- Installieren mit Paket-Manager-Konsole (PowerShell)
Verweisen auf .NET 8-Pakete
IHttpClientFactory
ist seit .NET Core 2.1 verfügbar, es wird jedoch empfohlen, die neuesten .NET 8-Pakete aus NuGet in Ihrem Projekt zu verwenden. In der Regel müssen Sie auch auf das Erweiterungspaket Microsoft.Extensions.Http.Polly
verweisen.
Konfigurieren Sie einen Client mit Polly's Retry-Richtlinie beim Start der App
Durch die Methode AddPolicyHandler() werden Richtlinien zu HttpClient
-Objekten hinzugefügt, die Sie verwenden werden. In diesem Fall wird eine Richtlinie von Polly für HTTP-Wiederholungen mit exponentiellem Backoff hinzugefügt.
Um einen modulareren Ansatz zu haben, kann die Http-Retry-Richtlinie in einer separaten Methode innerhalb der Program.cs-Datei definiert werden, wie im folgenden Code gezeigt:
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
retryAttempt)));
}
Wie in vorherigen Abschnitten gezeigt, müssen Sie eine httpClient-Konfiguration mit benanntem oder typiertem Client in Ihrer standardmäßigen Program.cs App-Konfiguration definieren. Jetzt fügen Sie wie folgt inkrementellen Code hinzu, der die Richtlinie für die HTTP-Wiederholungen mit exponentiellem Backoff angibt:
// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
.SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Set lifetime to five minutes
.AddPolicyHandler(GetRetryPolicy());
Mit Polly können Sie eine Wiederholungsrichtlinie mit der Anzahl der Wiederholungen, der exponentiellen Backoffkonfiguration und den Aktionen definieren, die ausgeführt werden sollen, wenn eine HTTP-Ausnahme vorliegt, z. B. das Protokollieren des Fehlers. In diesem Fall ist die Richtlinie so konfiguriert, dass sie sechs Mal mit einem exponentiellen Wiederholungsversuch ausgeführt wird und beginnt mit zwei Sekunden.
Hinzufügen einer Jitterstrategie zur Wiederholungsrichtlinie
Eine reguläre Wiederholungsrichtlinie kann Ihr System negativ beeinflussen, falls hohe Parallelität, hohe Skalierbarkeit und ein hohes Konfliktpotenzial vorhanden sind. Um mit Spitzenlasten umgehen zu können, die bei ähnlichen Wiederholungsanforderungen von vielen Clients bei einem Teilausfall auftreten, empfiehlt es sich als Notlösung, den Wiederholungsalgorithmus oder die Wiederholungsrichtlinie um eine Jitterstrategie zu ergänzen. Diese Strategie kann die Gesamtleistung des End-to-End-Systems verbessern. Wie in Polly: Retry with Jitter empfohlen, kann eine gute Jitter-Strategie durch gleichmäßig und reibungslos verteilte Wiederholungsintervalle implementiert werden, die mit einer gut kontrollierten Median-Anfangswiederholungsverzögerung auf einem exponentiellen Rückschritt angewendet werden. Dieser Ansatz hilft dabei, Spitzen zu verteilen, wenn das Problem auftritt. Das Prinzip wird durch das folgende Beispiel veranschaulicht:
var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);
var retryPolicy = Policy
.Handle<FooException>()
.WaitAndRetryAsync(delay);
Weitere Ressourcen
Wiederholungsmusterhttps://learn.microsoft.com/azure/architecture/patterns/retry
Polly und IHttpClientFactoryhttps://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory
Polly (Bibliothek für .NET-Resilienz und Behandlung vorübergehender Fehler)https://github.com/App-vNext/Polly
Polly: Wiederholungsversuch mit Jitterhttps://github.com/App-vNext/Polly/wiki/Retry-with-jitter
Marc Brooker. Jitter: Dinge mit Zufall verbessern https://brooker.co.za/blog/2015/03/21/backoff.html