Implementieren der 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 dann die folgende using-Anweisung in der Startklasse Ihrer Anwendung 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.

Diagramm: Im Standardresilienzhandler enthaltene Strategien (Gesamttimeout, Wiederholung, Bulkhead, Circuit Breaker und Versuchstimeout)

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

  • Strategie für das Gesamtanforderungstimeout: Diese Strategie legt 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 von Wiederholungsversuchen, Backoffs und Jitters. Diese Optionen können das in der vorherigen Strategie festgelegte Gesamttimeout nicht überschreiten.
  • Circuit Breaker-Strategie: Diese Strategie öffnet den Schaltkreis, wenn das Fehlerverhältnis den Schwellenwert überschreitet.
  • Timeoutstrategie: Diese Strategie legt ein Timeout für jede einzelne Anforderung fest. Wenn die Anforderung länger dauert als die mit diesem Timeout festgelegte Zeit, 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 einen Standardresilienzhandler hinzu. Dadurch werden alle Standardeinstellungen für die Wiederholungs- und Leistungsschutzschalter-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 Wiederholungsoptionen zu einer Ausnahme. Dies ist ein Fehler, da die Einstellung für das exponentielle Backoff dazu führen würde, dass die Gesamtzeit zum Durchführen der zehn Wiederholungen 2.046 Sekunden beträgt. 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 Eine Rückruffunktion, die bei einem Timeout für die Anforderung aufgerufen wird. Der Standardwert ist 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 erneuten Versuchen. Der Standardwert ist 2 Sekunden.

Circuit-Breaker-Optionen BESCHREIBUNG
BreakDuration Diese Option gibt die Dauer für den Circuit-Breaker an. Der Standardwert ist 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 lautet NULL.
OnHalfOpened Dabei handelt es sich um eine Rückruffunktion, die aufgerufen wird, wenn der Circuit Breaker halb geöffnet ist. Der Standardwert lautet NULL.
OnOpened Dabei handelt es sich um eine Rückruffunktion, die aufgerufen wird, wenn der Circuit Breaker geöffnet ist. Der Standardwert lautet NULL.

Optionen für das Versuchstimeout BESCHREIBUNG
Zeitlimit Diese Option legte die Dauer für die Anforderung fest. Der Standardwert ist 2 Sekunden.
OnTimeout Eine Rückruffunktion, die bei einem Timeout für die Anforderung aufgerufen wird. Der Standardwert ist NULL.

Sequenzdiagramm: Ereignisfluss in einer Anwendung mit einer Resilienzstrategie

Das 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 als die mit diesem Timeout festgelegte Zeit, wird eine Ausnahme ausgelöst.