Implementieren von 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.Resilience
hinzu. - 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 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.
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. |
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.