Implementieren von Anwendungsresilienz

Abgeschlossen

Die Resilienzfeatures von .NET basieren auf dem Polly-Projekt und werden über Microsoft.Extensions zur Verfügung gestellt. Sie können eine Standardresilienzstrategie mit sinnvollen Standardeinstellungen hinzufügen, indem Sie Ihrer App eine einzelne Codezeile hinzufügen.

Hinzufügen von Resilienz zu Ihrer App

Führen Sie die folgenden Schritte aus, um mithilfe einer HTTP-Anforderung zwischen einzelnen Diensten Resilienz zu einer App hinzufügen, die mit einer Microservices-Architektur erstellt wurde:

  1. Fügen Sie Ihrem Projekt das Paket Microsoft.Extensions.Http.Resilience hinzu.
  2. Fügen Sie Ihrem httpClient-Dienstaufrufen einen Resilienzhandler hinzu.
  3. Konfigurieren Sie die Resilienzstrategie.

Hinzufügen des NuGet-Pakets zu Ihrem Projekt

Führen Sie den folgenden Befehl aus, um das NuGet-Resilienzpaket hinzuzufügen:

dotnet add package Microsoft.Extensions.Http.Resilience

Wenn Sie diesen Befehl über das Terminal im Projektordner der App ausführen, wird der Projektdatei der Paketverweis hinzugefügt.

Fügen Sie in der Startklasse Ihrer Anwendung die folgende using-Anweisung hinzu:

using Microsoft.Extensions.Http.Resilience;

Hinzufügen einer Resilienzstrategie

Sie können Ihrem httpClient-Dienst jetzt eine Standardresilienzstrategie hinzufügen. In dieser .NET-Standardkonfiguration wird eine Reihe von Strategien kombiniert.

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

Der Anforderungshandler durchläuft jede der oben dargestellten Strategien in der Reihenfolge von links nach rechts:

  • Strategie für das Gesamtanforderungstimeout: Diese Strategie legte eine Gesamtdauer für die Anforderung fest. Sie können sich dies als obere Zeitgrenze vorstellen, die für alle anderen Strategien festgelegt wird.
  • Wiederholungsstrategie: Diese Strategie steuert die Optionen für die Anzahl an Wiederholungen, Backoffs und Jitter. Diese Optionen können das in der vorherigen Strategie festgelegte Gesamttimeout nicht überschreiten.
  • Circuit-Breaker-Strategie: Diese Strategie öffnet den Circuit Breaker, wenn das Fehlerverhältnis den Schwellenwert überschreitet.
  • Strategie für das Versuchstimeout: Diese Strategie legt ein Timeout für jede einzelne Anforderung fest. Wenn die Anforderung länger dauert, wird eine Ausnahme ausgelöst.

Sie können diese Standardstrategie mit allen Standardwerten durch diese Erweiterungsmethode hinzufügen:

.AddStandardResilienceHandler();

Wenn Sie beispielsweise WebApplication deklariert haben und dem httpClient-Dienst eine Resilienzstrategie hinzufügen möchten, verwenden Sie diesen Code:

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

Die erste Zeile des obigen Codes fügt dem httpClient-Dienst einen Standardresilienzhandler hinzu. Dadurch werden alle Standardeinstellungen für die Wiederholungs- und Circuit-Breaker-Strategien verwendet.

Konfigurieren der Resilienzstrategie

Sie können die Standardwerte einer Strategie ändern, indem Sie neue Optionen wie in diesem Beispiel angeben:

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

Mit diesem Code werden die Standardeinstellungen der Wiederholungsstrategie so geändert, dass maximal zehn Wiederholungen für ein lineares Backoff mit einer Basisverzögerung von einer Sekunde verwendet werden.

Die von Ihnen ausgewählten Optionen müssen miteinander kompatibel sein. Wenn beispielsweise die Standardeinstellung von 30 Sekunden für die Gesamtzeit beibehalten wird, führen die oben beschriebene Wiederholungsoptionen zu einer Ausnahme. Dies ist ein Fehler, da die exponentielle Backoffeinstellung dazu führen würde, dass die Gesamtzeit für zehn Wiederholungen bei 2046 Sekunden liegt. Dabei handelt es sich um eine Laufzeitausnahme und nicht um einen Kompilierzeitfehler.

In der folgenden Tabelle werden die Optionen aufgeführt, die für jede Strategie verfügbar sind.

Optionen für das Gesamtanforderungstimeout Beschreibung
TotalTimeout Diese Option legte die Gesamtdauer für die Anforderung fest. Der Standardwert ist 30 Sekunden.
OnTimeout Dabei handelt es sich um eine Rückruffunktion, die aufgerufen wird, wenn für die Anforderung ein Timeout auftritt. Der Standardwert lautet NULL.

Wiederholungsoptionen Beschreibung
RetryCount Die maximale Anzahl von Warnungen. Der Standardwert ist 3.
BackoffType Dabei handelt es sich um den Typ des zu verwendenden Backoffs. Sie können zwischen einem linearen und einem exponentiellen Typ wählen. Standardmäßig wird der exponentielle Typ verwendet.
UseJitter Diese Option gibt an, ob Jitter zum Backoff hinzugefügt werden soll. Jitter fügt der Verzögerung ein Zufallselement hinzu, um Lastspitzen zu reduzieren. Der Standardwert ist „true“.
BaseDelay Die Verzögerung zwischen den Wiederholungsversuchen. Der Standardwert beträgt 2 Sekunden.

Circuit-Breaker-Optionen Beschreibung
BreakDuration Diese Option gibt die Dauer für den Circuit-Breaker an. Die Standardeinstellung beträgt 5 Sekunden.
FailureRatio Dabei handelt es sich um das Verhältnis der fehlgeschlagenen zu den erfolgreichen Anforderungen, das den Circuit Breaker öffnet. Der Standardwert ist 0,1.
SamplingDuration Dabei handelt es sich um die Dauer, über die das Fehlerverhältnis berechnet wird. Der Standardwert ist 30 Sekunden.
OnClosed Dabei handelt es sich um eine Rückruffunktion, die aufgerufen wird, wenn der Circuit Breaker geschlossen ist. Der Standardwert ist NULL.
OnHalfOpened Dabei handelt es sich um eine Rückruffunktion, die aufgerufen wird, wenn der Circuit Breaker halb geöffnet ist. Der Standardwert ist NULL.
OnOpened Dabei handelt es sich um eine Rückruffunktion, die aufgerufen wird, wenn der Circuit Breaker geöffnet ist. Der Standardwert ist NULL.

Optionen für das Versuchstimeout Beschreibung
Timeout Diese Option legte die Dauer für die Anforderung fest. Der Standardwert beträgt 2 Sekunden.
OnTimeout Dabei handelt es sich um eine Rückruffunktion, die aufgerufen wird, wenn für die Anforderung ein Timeout auftritt. Der Standardwert lautet NULL.

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

Das obige Sequenzdiagramm zeigt, wie die einzelnen Strategien in einer Standardresilienzstrategie zusammenarbeiten. Der begrenzende Faktor für die Dauer einer Anforderung wird zunächst durch die Gesamttimeoutstrategie gesteuert. Die Wiederholungsstrategie muss dann so festgelegt werden, dass eine maximale Anzahl an Wiederholungen innerhalb des Gesamttimeouts abgeschlossen wird. Die Circuit-Breaker-Strategie öffnet den Circuit Breaker, wenn das Fehlerverhältnis den festgelegten Schwellenwert überschreitet. Diese Strategie für das Versuchstimeout legt ein Timeout für jede einzelne Anforderung fest. Wenn die Anforderung länger dauert, wird eine Ausnahme ausgelöst.