Implementieren der Anwendungsresilienz
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:
- Fügen Sie Ihrem Projekt das Paket
Microsoft.Extensions.Http.Resiliencehinzu. - Fügen Sie Ihrem httpClient-Dienstaufrufen einen Resilienzhandler hinzu.
- 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.
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. |
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.