REL 5: Wie lassen sich Interaktionen in einem verteilten System so gestalten, dass Ausfälle abgemildert oder bewältigt werden?
Verteilte Systeme nutzen Kommunikationsnetzwerke, um Komponenten (wie Server oder Services) miteinander zu verbinden. Ihre Workload muss trotz Datenverlust oder höherer Latenz in diesen Netzwerken zuverlässig ausgeführt werden. Komponenten des verteilten Systems müssen so funktionieren, dass sie keine negativen Auswirkungen auf andere Komponenten oder die Workload haben. Mit den folgenden bewährten Methoden können Workloads Belastungen oder Ausfällen standhalten, schneller wiederhergestellt werden und die Auswirkungen solcher Beeinträchtigungen verringern. Das Ergebnis ist eine verbesserte mittlere Reparaturzeit (MTTR).
Ressourcen
Retry, backoff, and jitter: AWS re:Invent 2019: Introducing The Amazon Builders’ Library
(DOP328)
Error Retries and Exponential Backoff in AWS
Amazon API Gateway: Throttle API Requests for Better Throughput
The Amazon Builders' Library: Timeouts, retries, and backoff with jitter
The Amazon Builders' Library: Avoiding fallback in distributed systems
The Amazon Builders' Library: Avoiding insurmountable queue backlogs
The Amazon Builders' Library: Caching challenges and strategies
Well-Architected lab: Level 300: Implementing Health Checks and Managing Dependencies
to Improve Reliability
CircuitBreaker (summarizes Circuit Breaker from “Release It!” book)
Michael Nygard “Release It! Design and Deploy Production-Ready Software”
Bewährte Methoden:
-
Implementieren einer ordnungsgemäßen Funktionsminderung, um harte Abhängigkeiten in weiche zu ändern: Wenn die Abhängigkeiten einer Komponente fehlerhaft sind, kann die Komponente selbst weiterhin funktionieren, wenn auch in eingeschränkter Weise. Wenn beispielsweise ein Abhängigkeitsaufruf fehlschlägt, erfolgt ein Failover auf eine vordefinierte statische Antwort.
-
Drosseln von Anfragen: Hierbei handelt es sich um ein Abmilderungsmuster, mit dem auf einen unerwarteten Anstieg der Nachfrage reagiert werden kann. Einige Anfragen werden berücksichtigt, doch solche, die über ein definiertes Limit hinausgehen, werden abgelehnt. Zudem wird eine entsprechende Meldung über deren Drosselung zurückgegeben. Dabei wird erwartet, dass Clients die Anfragen abbrechen oder es mit einer langsameren Rate erneut versuchen.
-
Steuern und Einschränken von Wiederholungsaufrufen: Verwenden Sie ein exponentielles Backoff, um Aufrufe nach zunehmend längeren Intervallen zu wiederholen. Führen Sie Jitter ein, um die Wiederholungsintervalle zufällig festzulegen, und begrenzen Sie die Höchstzahl von Wiederholungen.
-
Verwenden von Fail-Fast und Begrenzen von Warteschlangen: Wenn eine Workload auf eine Anfrage nicht erfolgreich antworten kann, sollte sie per Fail-Fast beendet werden. So können Ressourcen freigegeben werden, die einer Anfrage zugeordnet sind, und der Service kann entlastet werden, wenn die Ressourcen zur Neige gehen. Wenn die Workload erfolgreich antworten kann, aber die Rate der Anfragen zu hoch ist, sollten Sie die Anfragen mithilfe einer Warteschlange puffern. Lassen Sie jedoch keine langen Warteschlangen zu. Sie können dazu führen, dass veraltete Anfragen verarbeitet werden, die der Client bereits aufgegeben hat.
-
Festlegen von Client-Zeitbeschränkungen: Legen Sie Zeitbeschränkungen entsprechend fest, überprüfen Sie sie systematisch und verlassen Sie sich nicht auf Standardwerte, da sie in der Regel zu hoch eingestellt sind.
-
Einstellen der Zustandslosigkeit für Services: Services sollten entweder keinen Zustand erfordern oder ihn so auslagern, dass zwischen verschiedenen Clientanfragen keine Abhängigkeit von lokal gespeicherten Daten auf der Festplatte oder im Arbeitsspeicher besteht. Auf diese Weise können Server nach Belieben ersetzt werden, ohne dass dies Auswirkungen auf die Verfügbarkeit hat. Amazon ElastiCache und Amazon DynamoDB sind gute Ziele für einen ausgelagerten Zustand.
-
Implementieren von Nothebeln: Hierbei handelt es sich um schnelle Prozesse, die die Auswirkungen auf die Verfügbarkeit Ihrer Workload mindern können. Sie können ausgeführt werden, wenn keine Ursache vorliegt. Ein idealer Nothebel reduziert die kognitive Belastung der Resolver auf null, indem er vollständig deterministische Aktivierungs- und Deaktivierungskriterien bereitstellt. Mit Hebeln lässt sich zum Beispiel der gesamte Roboterdatenverkehr blockieren oder eine statische Antwort bereitstellen. Hebel müssen oft manuell ausgeführt werden, können aber auch automatisiert werden.
Verbesserungsplan
Implementieren einer ordnungsgemäßen Funktionsminderung, um harte Abhängigkeiten in
weiche zu ändern
- Durch Rückgabe einer statischen Antwort mildert die Workload Fehler ab, die in den
Abhängigkeiten auftreten.
Well-Architected lab: Level 300: Implementing Health Checks and Managing Dependencies to Improve Reliability - Erkennen Sie, wann ein Wiederholungsvorgang wahrscheinlich fehlschlägt, und verhindern
Sie mit dem Schaltkreisunterbrecher, dass der Client fehlgeschlagene Aufrufe wiederholt.
CircuitBreaker
Drosseln von Anfragen
- Verwenden von Amazon API Gateway
Throttle API Requests for Better Throughput
Steuern und Einschränken von Wiederholungsaufrufen
Error Retries and Exponential Backoff in AWS
- Mit Amazon SDKs wird dies standardmäßig implementiert. Implementieren Sie in die Abhängigkeitsebene zum Aufrufen Ihrer eigenen abhängigen Services eine ähnliche Logik. Legen Sie entsprechend Ihrem Anwendungsfall Zeitüberschreitungen fest und geben Sie an, wann Wiederholversuche gestoppt werden sollen.
Verwenden von Fail-Fast und Begrenzen von Warteschlangen
- Implementieren von Fail-Fast bei einer hohen Belastung von Services
Fail Fast - Begrenzen von Warteschlangen: Wenn in einem warteschlangenbasierten System die Verarbeitung gestoppt wird, aber
weiterhin Nachrichten eintreffen, kann ein großer Rückstand an unverarbeiteten Nachrichten
entstehen, was die Verarbeitungszeit erhöht. In diesem Fall wird die Arbeit unter
Umständen so spät abgeschlossen, dass die Ergebnisse nicht mehr von Nutzen sind. Dies
führt im Wesentlichen zu einer Beeinträchtigung der Verfügbarkeit, die mit der Warteschlange
eigentlich aufrechterhalten werden sollte.
The Amazon Builders' Library: Avoiding insurmountable queue backlogs
Festlegen von Client-Zeitbeschränkungen
AWS SDK: Retries and Timeouts
Einstellen der Zustandslosigkeit für Services
- Entfernen Sie Zustände, die tatsächlich in Anfrageparametern gespeichert werden können.
- Manche Daten (wie Cookies) können in Headern oder Abfrageparametern übergeben werden.
- Entfernen Sie Zustände, die sich schnell in Anfragen übergeben lassen.
- Nachdem Sie untersucht haben, ob der Zustand erforderlich ist, verlagern Sie die gesamte
Zustandsverfolgung in einen ausfallsicheren Multi-Zonen-Cache oder -Datenspeicher
wie Amazon ElastiCache, Amazon RDS, Amazon DynamoDB oder die verteilte Datenlösung
eines Drittanbieters.: Speichern Sie nicht verlagerbare Zustände in ausfallsicheren Datenspeichern.
- Einige Daten sind möglicherweise nicht für jede Anfrage erforderlich, sondern können bei Bedarf abgerufen werden.
- Entfernen Sie asynchron abrufbare Daten.
- Wählen Sie einen Datenspeicher, der die Anforderungen eines erforderlichen Zustands erfüllt.
- Ziehen Sie für nichtrelationale Daten eine NoSQL-Datenbank in Erwägung.
Implementieren von Nothebeln
- Tipps zur Implementierung und Verwendung von Nothebeln
- Wenn die Hebel aktiviert sind, sollten Sie WENIGER machen, nicht mehr.
- Halten Sie die Dinge einfach, vermeiden Sie bimodales Verhalten.
- Testen Sie die Hebel regelmäßig.
- Nachfolgend finden Sie Beispiele für Aktionen, die KEINE Nothebel sind:
- Kapazität hinzufügen
- Servicebesitzer von Clients anrufen, die von Ihrem Service abhängig sind, und sie bitten, Aufrufe zu reduzieren
- Code ändern und freigeben