Freigeben über


Implementieren von Wiederholungen von HTTP-Aufrufen mit exponentiellem Backoff mit IHttpClientFactory und Polly-Richtlinien

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.

.NET Microservices-Architektur für containerisierte .NET-Anwendungen eBook-Cover-Thumbnail.

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.

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.Pollyverweisen.

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