Implementieren von Wiederholungen von HTTP-Aufrufen mit exponentiellem Backoff mit IHttpClientFactory und Polly-RichtlinienImplement HTTP call retries with exponential backoff with IHttpClientFactory and Polly policies

Für Wiederholungen mit exponentiellem Backoff wird empfohlen, fortgeschrittenere .NET-Bibliotheken wie die Open Source-Bibliothek Polly zu verwenden.The recommended approach for retries with exponential backoff is to take advantage of more advanced .NET libraries like the open-source Polly library.

Polly ist eine .NET-Bibliothek, die Funktionen für die Flexibilität und die Behandlung von vorübergehenden Fehlern bereitstellt.Polly is a .NET library that provides resilience and transient-fault handling capabilities. Sie können diese Funktionen implementieren, indem Sie Polly-Richtlinien wie „Retry“, „Circuit Breaker“, „Bulkhead Isolation“, „Timeout“, und „Fallback“ anwenden.You can implement those capabilities by applying Polly policies such as Retry, Circuit Breaker, Bulkhead Isolation, Timeout, and Fallback. Polly unterstützt .NET Framework 4.x und .NET Standard 1.0, 1.1 und 2.0 (unterstützt .NET Core und höher).Polly targets .NET Framework 4.x and .NET Standard 1.0, 1.1, and 2.0 (which supports .NET Core and later).

Die folgenden Schritte veranschaulichen, wie Sie HTTP-Wiederholungen mit Polly in IHttpClientFactory verwenden können. Die Integration von Polly wird im vorherigen Abschnitt erläutert.The following steps show how you can use Http retries with Polly integrated into IHttpClientFactory, which is explained in the previous section.

Verweisen auf die .NET 5-PaketeReference the .NET 5 packages

IHttpClientFactory ist seit .NET Core 2.1 verfügbar. Wir empfehlen jedoch die Verwendung der neuesten .NET 5-Pakete auf NuGet in Ihrem Projekt.IHttpClientFactory is available since .NET Core 2.1 however we recommend you to use the latest .NET 5 packages from NuGet in your project. In der Regel müssen Sie auch auf das Erweiterungspaket Microsoft.Extensions.Http.Polly verweisen.You typically also need to reference the extension package Microsoft.Extensions.Http.Polly.

Konfigurieren eines Clients mit der Wiederholungsrichtlinie von Polly in der Startup-KlasseConfigure a client with Polly's Retry policy, in Startup

Wie in den vorherigen Abschnitten beschrieben wurde, müssen Sie eine benannte oder typisierte HttpClient-Clientkonfiguration in Ihrer Startup.ConfigureServices(...)-Standardmethode definieren. Nun fügen Sie jedoch inkrementellen Code hinzu, der die Richtlinie für die HTTP-Wiederholungen mit exponentiellem Backoff angibt:As shown in previous sections, you need to define a named or typed client HttpClient configuration in your standard Startup.ConfigureServices(...) method, but now, you add incremental code specifying the policy for the Http retries with exponential backoff, as below:

//ConfigureServices()  - Startup.cs
services.AddHttpClient<IBasketService, BasketService>()
        .SetHandlerLifetime(TimeSpan.FromMinutes(5))  //Set lifetime to five minutes
        .AddPolicyHandler(GetRetryPolicy());

Durch die Methode AddPolicyHandler() werden Richtlinien zu HttpClient-Objekten hinzugefügt, die Sie verwenden werden.The AddPolicyHandler() method is what adds policies to the HttpClient objects you'll use. In diesem Fall wird eine Richtlinie von Polly für HTTP-Wiederholungen mit exponentiellem Backoff hinzugefügt.In this case, it's adding a Polly's policy for Http Retries with exponential backoff.

Für einen modulareren Ansatz kann die HTTP-Wiederholungsrichtlinie in einer separaten Methode innerhalb der Startup.cs-Datei definiert werden. Dies wird im folgenden Code veranschaulicht:To have a more modular approach, the Http Retry Policy can be defined in a separate method within the Startup.cs file, as shown in the following code:

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
        .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
                                                                    retryAttempt)));
}

Mit Polly können Sie eine Wiederholungsrichtlinie definieren, die die Anzahl von Wiederholungen, die Konfiguration des exponentiellen Backoffs und die Aktionen enthält, die ausgeführt werden, wenn eine HTTP-Ausnahme ausgelöst wird, z.B. die Protokollierung des Fehlers.With Polly, you can define a Retry policy with the number of retries, the exponential backoff configuration, and the actions to take when there's an HTTP exception, such as logging the error. In diesem Fall ist die Richtlinie dafür konfiguriert, sechs Versuche mit einer exponentiellen Wiederholung durchzuführen, die bei zwei Sekunden beginnt.In this case, the policy is configured to try six times with an exponential retry, starting at two seconds.

Hinzufügen einer Jitterstrategie zur WiederholungsrichtlinieAdd a jitter strategy to the retry policy

Eine reguläre Wiederholungsrichtlinie kann Ihr System negativ beeinflussen, falls hohe Parallelität, hohe Skalierbarkeit und ein hohes Konfliktpotenzial vorhanden sind.A regular Retry policy can affect your system in cases of high concurrency and scalability and under high contention. 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.To overcome peaks of similar retries coming from many clients in partial outages, a good workaround is to add a jitter strategy to the retry algorithm/policy. Diese Strategie kann die Gesamtleistung des End-to-End-Systems verbessern.This strategy can improve the overall performance of the end-to-end system. Wie in Polly: Retry with Jitter empfohlen, lässt sich eine gute Jitterstrategie durch geglättete und gleichmäßig verteilte Wiederholungsintervalle implementieren, die mit einer gut kontrollierten anfänglichen Median-Wiederholungsverzögerung auf ein exponentielles Backoff angewendet werden.As recommended in Polly: Retry with Jitter, a good jitter strategy can be implemented by smooth and evenly distributed retry intervals applied with a well-controlled median initial retry delay on an exponential backoff. Dieser Ansatz hilft dabei, Spitzen zu verteilen, wenn das Problem auftritt.This approach helps to spread out the spikes when the issue arises. Das Prinzip wird im folgenden Beispiel dargestellt:The principle is illustrated by the following example:


var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);

var retryPolicy = Policy
    .Handle<FooException>()
    .WaitAndRetryAsync(delay);

Zusätzliche RessourcenAdditional resources