Empfehlungen zur Selbstheilung und Selbsterhaltung

Gilt für diese Empfehlung der Prüfliste für die Zuverlässigkeit von Azure Well-Architected Framework:

RE:07 Stärken Sie die Resilienz und Wiederherstellbarkeit Ihrer Workload, indem Sie Selbsterhaltungs- und Selbstreparaturmaßnahmen implementieren. Integrieren Sie Funktionen in die Lösung, indem Sie infrastrukturbasierte Zuverlässigkeitsmuster und softwarebasierte Entwurfsmuster verwenden, um Komponentenfehler und vorübergehende Fehler zu behandeln. Integrieren Sie Funktionen in das System, um Fehler von Lösungskomponenten zu erkennen und automatisch Korrekturmaßnahmen zu initiieren, während die Workload weiterhin mit voller oder eingeschränkter Funktionalität ausgeführt wird.

Verwandte Leitfäden:Hintergrundaufträge | Vorübergehende Fehler

In diesem Leitfaden werden die Empfehlungen zum Erstellen von Selbstreparatur- und Selbsterhaltungsfunktionen in Ihrer Anwendungsarchitektur beschrieben, um die Zuverlässigkeit zu optimieren.

Funktionen zur Selbsterhaltung erhöhen Ihre Workload durch Resilienz. Sie verringern die Wahrscheinlichkeit eines vollständigen Ausfalls und ermöglichen es Ihrer Workload, in einem beeinträchtigten Zustand zu arbeiten, während fehlerhafte Komponenten wiederhergestellt werden. Selbstreparaturfunktionen helfen Ihnen, Ausfallzeiten zu vermeiden, indem Sie fehlererkennung und automatische Korrekturmaßnahmen zur Reaktion auf verschiedene Fehlertypen erstellen.

In diesem Leitfaden werden Entwurfsmuster beschrieben, die sich auf Selbsterhaltung und Selbstreparatur konzentrieren. Integrieren Sie sie in Ihre Workload, um ihre Resilienz und Wiederherstellbarkeit zu verbessern. Wenn Sie keine Muster implementieren, besteht das Risiko, dass Ihre Apps ausfallen, wenn unvermeidliche Probleme auftreten.

Definitionen

Begriff Definition
Selbstreparatur Die Fähigkeit Ihrer Workload, Probleme automatisch zu beheben, indem sie betroffene Komponenten wiederherstellen und bei Bedarf ein Failover auf eine redundante Infrastruktur durchführen.
Selbsterhaltung Die Fähigkeit Ihrer Workload, gegen potenzielle Probleme widerstandsfähig zu sein.

Wichtige Entwurfsstrategien

Anleitung zur Selbsterhaltung

Um Ihre Workload selbst zu konservieren, befolgen Sie die Entwurfsmuster für Infrastruktur und Anwendungsarchitektur, um die Resilienz Ihrer Workload zu optimieren. Um die Wahrscheinlichkeit eines vollständigen Anwendungsausfalls zu minimieren, erhöhen Sie die Resilienz Ihrer Lösung, indem Sie einzelne Fehlerpunkte beseitigen und den Strahlradius von Fehlern minimieren. Die Entwurfsansätze in diesem Artikel bieten mehrere Optionen, um die Resilienz Ihrer Workload zu stärken und die definierten Zuverlässigkeitsziele Ihrer Workload zu erreichen.

Anleitungen und Muster für den Infrastrukturentwurf

Auf Infrastrukturebene sollte ein redundanter Architekturentwurf Ihre kritischen Flows unterstützen, wobei Ressourcen in Verfügbarkeitszonen oder Regionen bereitgestellt werden. Implementieren Sie nach Möglichkeit die automatische Skalierung . Die automatische Skalierung schützt Ihre Workload vor unerwarteten Bursts in Aktivitäten und stärkt Ihre Infrastruktur weiter.

Verwenden Sie das Muster Bereitstellungsstempel oder das Bulkhead-Muster, um den Strahlradius zu minimieren, wenn Probleme auftreten. Diese Muster tragen dazu bei, Ihre Workload verfügbar zu halten, wenn eine einzelne Komponente nicht verfügbar ist. Verwenden Sie die folgenden Anwendungsentwurfsmuster in Kombination mit Ihrer Strategie für die automatische Skalierung.

  • Bereitstellungsstempelmuster: Bereitstellen, Verwalten und Überwachen einer unterschiedlichen Gruppe von Ressourcen zum Hosten und Betreiben mehrerer Workloads oder Mandanten. Die einzelnen Kopien werden als Stempel oder mitunter auch als Diensteinheit, Skalierungseinheit oder Zelle bezeichnet.

  • Bulkheadmuster: Partitionieren von Dienstinstanzen in verschiedene Gruppen, die als Pools bezeichnet werden, basierend auf den Anforderungen an die Auslastung und Verfügbarkeit des Consumers. Dieser Entwurf hilft, Fehler zu isolieren, und ermöglicht es Ihnen, die Dienstfunktionalität für einige Consumer auch während eines Ausfalls aufrechtzuerhalten.

Anleitungen und Muster für den Anwendungsentwurf

Vermeiden Sie das Erstellen monolithischer Anwendungen in Ihrem Anwendungsentwurf. Verwenden Sie lose gekoppelte Dienste oder Microservices, die über klar definierte Standards miteinander kommunizieren, um das Risiko umfangreicher Probleme bei Fehlfunktionen einer einzelnen Komponente zu verringern. Beispielsweise können Sie die Verwendung eines Service Bus standardisieren, um die gesamte asynchrone Kommunikation zu verarbeiten. Durch die Standardisierung von Kommunikationsprotokollen wird sichergestellt, dass der Anwendungsentwurf konsistent und vereinfacht wird, wodurch die Workload zuverlässiger und einfacher zu behandeln ist, wenn Fehlfunktionen auftreten. Wenn es sinnvoll ist, sollten Sie die asynchrone Kommunikation zwischen Komponenten der synchronen Kommunikation vorziehen, um Timeoutprobleme wie unzustellbare Nachrichten zu minimieren. Die folgenden Entwurfsmuster helfen Ihnen, Ihre Workload zu organisieren und die Kommunikation zwischen Komponenten so zu definieren, dass Ihre Geschäftsanforderungen am besten erfüllt werden.

  • Ambassador-Muster: Trennen Sie Ihre Geschäftslogik von Ihrem Netzwerkcode und ihrer Resilienzlogik. Erstellen Sie Hilfsdienste, die im Auftrag von Consumerdiensten oder -anwendungen Netzwerkanforderungen senden. Sie können dieses Muster verwenden, um Wiederholungsmechanismen oder Leitungsbrüche zu implementieren.

  • Asynchrones Request-Reply Muster: Entkoppeln Sie die Back-End-Verarbeitung von einem Front-End-Host, wenn die Back-End-Verarbeitung asynchron sein muss, das Front-End jedoch eine klare Antwort benötigt.

  • Cache-Aside-Muster: Laden Sie Daten bei Bedarf aus einem Datenspeicher in einen Cache. Dieses Muster kann die Leistung verbessern und dabei helfen, die Konsistenz zwischen Daten, die im Cache gespeichert sind, und Daten im zugrunde liegenden Datenspeicher aufrechtzuerhalten.

  • Trennschaltermuster: Verwenden Sie Trennschalter, um proaktiv zu bestimmen, ob ein Vorgang fortgesetzt werden kann oder ob eine Ausnahme basierend auf der Anzahl der aktuellen Fehler zurückgegeben werden soll.

  • Anspruchsprüfungsmuster: Teilen Sie eine große Nachricht in eine Anspruchsprüfung und eine Nutzlast auf. Senden Sie die Anspruchsprüfung an die Messagingplattform, und speichern Sie die Nutzlast in einem externen Dienst. Dieses Muster ermöglicht es, große Nachrichten zu verarbeiten, während der Nachrichtenbus geschützt wird und der Client nicht überlastet oder verlangsamt wird.

  • Konkurrierende Consumer-Muster: Ermöglichen Sie es mehreren gleichzeitigen Consumern, Nachrichten zu verarbeiten, die im selben Messagingkanal empfangen werden. Ein System kann mehrere Nachrichten gleichzeitig verarbeiten, wodurch der Durchsatz optimiert, die Skalierbarkeit und Verfügbarkeit verbessert und die Workload ausgeglichen wird.

  • Konfigurieren von Anforderungstimeouts: Konfigurieren Sie Anforderungstimeouts für Aufrufe von Diensten oder Datenbanken. Das Datenbankverbindungstimeout wird in der Regel auf 30 Sekunden festgelegt.

  • Gatekeeper-Muster: Schützen Sie Anwendungen und Dienste, indem Sie einen dedizierten Host instance verwenden, um Anforderungen zwischen Clients und der Anwendung oder dem Dienst zu vermitteln. Der Broker überprüft und behebt die Anforderungen und kann eine zusätzliche Sicherheitsebene bereitstellen, um die Angriffsfläche des Systems zu begrenzen.

  • Warteschlangenbasiertes Lastenausgleichsmuster: Entkoppeln Sie die Aufgaben vom Dienst in Ihrer Lösung, indem Sie eine Warteschlange zwischen ihnen verwenden, damit sie jeweils asynchron ausgeführt werden können. Verwenden Sie eine Warteschlange als Puffer zwischen einer Aufgabe und einem Dienst, den sie aufruft, um zeitweilige hohe Lasten zu glätten, die dazu führen können, dass der Dienst fehlschlägt oder der Task ein Timeout auftritt. Dieses Muster kann dazu beitragen, die Auswirkungen von Nachfragespitzen auf die Verfügbarkeit und Reaktionsfähigkeit für die Aufgabe und den Dienst zu minimieren.

  • Drosselungsmuster: Steuern Sie den Verbrauch von Ressourcen, die von einer instance einer Anwendung, eines einzelnen Mandanten oder eines gesamten Diensts verwendet werden. Dieses Muster ermöglicht es dem System, weiterhin zu funktionieren und Vereinbarungen zum Servicelevel (SLAs) zu erfüllen, auch wenn ein Anstieg der Nachfrage eine extreme Belastung für Ressourcen darstellt.

  • Muster für vorübergehende Fehlerbehandlung und Wiederholungsmuster: Implementieren Sie eine Strategie zur Behandlung vorübergehender Fehler, um Resilienz in Ihrer Workload zu gewährleisten. Vorübergehende Fehler sind normale und erwartete Ereignisse in Cloudumgebungen. Typische Ursachen für vorübergehende Fehler sind vorübergehende Netzwerkkonnektivitätsverluste, eine unterbrochene Datenbankverbindung oder ein Timeout, wenn ein Dienst ausgelastet ist. Weitere Informationen zum Entwickeln einer Wiederholungsstrategie finden Sie im Leitfaden zur Behandlung vorübergehender Fehler in dieser Reihe.

Hintergrundaufträge

Hintergrundaufträge sind eine effektive Möglichkeit, die Zuverlässigkeit eines Systems zu verbessern, indem Aufgaben von der Benutzeroberfläche entkoppelt werden. Implementieren Sie eine Aufgabe als Hintergrundauftrag, wenn sie keine Benutzereingaben oder Feedback erfordert und sich nicht auf die Reaktionsfähigkeit der Benutzeroberfläche auswirkt.

Häufige Beispiele für Hintergrundaufträge sind:

  • CPU-intensive Aufträge, z. B. das Ausführen komplexer Berechnungen oder die Analyse von Strukturmodellen.
  • E/A-intensive Aufträge, z. B. das Ausführen mehrerer Speichervorgänge oder das Indizieren großer Dateien.
  • Batchaufträge, z. B. regelmäßiges Aktualisieren von Daten oder Verarbeiten von Aufgaben zu einem bestimmten Zeitpunkt.
  • Workflows mit langer Ausführungsdauer, z. B. das Abschließen eines Auftrags oder die Bereitstellung von Diensten und Systemen.

Weitere Informationen finden Sie unter Empfehlungen für Hintergrundaufträge.

Anleitung zur Selbstreparatur

Um Ihre Workload für die Selbstreparatur zu entwerfen, implementieren Sie die Fehlererkennung, damit automatische Antworten ausgelöst und kritische Flows ordnungsgemäß wiederhergestellt werden. Aktivieren Sie die Protokollierung, um operative Erkenntnisse über die Art des Fehlers und den Erfolg der Wiederherstellung zu erhalten. Die Ansätze, die Sie verwenden, um eine Selbstreparatur für einen kritischen Flow zu erreichen, hängen von den Zuverlässigkeitszielen ab, die für diesen Flow definiert sind, sowie von den Komponenten und Abhängigkeiten des Flows.

Leitfaden für den Infrastrukturentwurf

Auf Infrastrukturebene sollten Ihre kritischen Flows von einem redundanten Architekturentwurf mit aktiviertem automatisiertem Failover für Komponenten unterstützt werden, die dies unterstützen. Sie können das automatisierte Failover für die folgenden Arten von Diensten aktivieren:

  • Computeressourcen: Azure Virtual Machine Scale Sets und die meisten PaaS-Computedienste (Platform-as-a-Service) können für das automatische Failover konfiguriert werden.

  • Datenbanken: Relationale Datenbanken können für das automatische Failover mit Lösungen wie Azure SQL Failoverclustern, Always On Verfügbarkeitsgruppen oder integrierten Funktionen mit PaaS-Diensten konfiguriert werden. NoSQL-Datenbanken verfügen über ähnliche Clusteringfunktionen und integrierte Funktionen für PaaS-Dienste.

  • Speicher: Verwenden Sie redundante Speicheroptionen mit automatischem Failover.

Anleitungen und Muster für den Anwendungsentwurf

  • Blockieren von fehlerhaften Akteuren: Wenn Sie einen Client drosseln, bedeutet dies nicht, dass der Client böswillig gehandelt hat. Dies kann bedeuten, dass der Client sein Dienstkontingent überschritten hat. Wenn ein Client jedoch sein Kontingent konsistent überschreitet oder sich anderweitig schlecht verhält, können Sie sie blockieren. Definieren Sie einen Out-of-Band-Prozess für einen Client, um die Aufhebung der Blockierung anzufordern.

  • Trennschaltermuster: Wenn ein Fehler nach der Einleitung des Wiederholungsmechanismus weiterhin besteht, riskieren Sie kaskadierende Fehler, die aus einem wachsenden Backlog von Aufrufen resultieren. Ein Trennschalter, der für die Arbeit mit dem Wiederholungsmechanismus entwickelt wurde, begrenzt das Risiko kaskadierender Fehler, indem er verhindert, dass die App wiederholt versucht, einen Vorgang auszuführen, der wahrscheinlich fehlschlägt.

  • Kompensierendes Transaktionsmuster: Wenn Sie einen letztlich konsistenten Vorgang verwenden, der aus einer Reihe von Schritten besteht, implementieren Sie das Muster kompensierende Transaktion. Wenn mindestens einer der Schritte fehlschlägt, können Sie dieses Muster verwenden, um die von den Schritten ausgeführte Arbeit rückgängig zu machen.

  • Ordnungsgemäßes Herunterstufen: Manchmal können Sie ein Problem nicht umgehen, aber Sie können eine eingeschränkte Funktionalität bereitstellen. Stellen Sie sich eine Anwendung vor, in der ein Katalog mit Büchern angezeigt wird. Wenn die Anwendung das Miniaturbild für den Buchdeckel nicht abrufen kann, wird ggf. ein Platzhalterbild angezeigt. Möglicherweise sind gesamte Subsysteme für die Anwendung nicht kritisch. Beispielsweise ist für eine E-Commerce-Website das Anzeigen von Produktempfehlungen wahrscheinlich weniger wichtig als die Verarbeitung von Bestellungen. Eine ordnungsgemäße Verschlechterung kann auch automatische Failovervorgänge umfassen. Wenn eine Datenbank aufgrund eines Problems mit dem primären instance automatisch auf ein Replikat übergeht, wird die Leistung für kurze Zeit beeinträchtigt.

  • Führungswahlmuster: Wenn Sie eine Aufgabe koordinieren müssen, verwenden Sie die Leaderwahl, um einen Koordinator auszuwählen, damit ein Koordinator kein einzelner Fehlerpunkt ist. Wenn der Koordinator ausfällt, wird ein neuer ausgewählt. Anstatt einen Leader-Wahlalgorithmus von Grund auf neu zu implementieren, sollten Sie eine Standardlösung wie ZooKeeper in Betracht ziehen.

  • Testmuster: Schließen Sie tests der Muster ein, die Sie als Teil Ihrer Standardtestprozeduren implementieren.

  • Verwenden von Prüfpunkten für Transaktionen mit langer Ausführungsdauer: Prüfpunkte können Resilienz bieten, wenn ein Vorgang mit langer Ausführungszeit fehlschlägt. Wenn der Vorgang neu gestartet wird, z. B. von einem anderen virtuellen Computer, kann er am letzten Prüfpunkt fortgesetzt werden. Erwägen Sie, einen Mechanismus zu implementieren, der in regelmäßigen Abständen Zustandsinformationen zur Aufgabe aufzeichnet. Speichern Sie diesen Zustand im dauerhaften Speicher, auf den jeder instance des Prozesses zugreifen kann, auf den die Aufgabe ausgeführt wird. Wenn der Prozess heruntergefahren wird, kann die ausgeführte Arbeit vom letzten Prüfpunkt aus mit einem anderen instance fortgesetzt werden. Manche Bibliotheken, wie z. B. NServiceBus und MassTransit, stellen diese Funktionalität bereit. Sie halten den Zustand transparent aufrecht, wobei die Intervalle auf die Verarbeitung von Nachrichten aus Warteschlangen in Azure Service Bus abgestimmt sind.

Automatisierte Selbstheilungsaktionen

Ein weiterer Ansatz zur Selbstheilung ist die Verwendung automatisierter Aktionen, die von Ihrer Überwachungslösung ausgelöst werden, wenn vorab festgelegte Integritäts- status Änderungen erkannt werden. Wenn Ihre Überwachung beispielsweise erkennt, dass eine Web-App nicht auf Anforderungen reagiert, können Sie eine Automatisierung über ein PowerShell-Skript erstellen, um den App-Dienst neu zu starten. Verwenden Sie je nach Qualifikation und bevorzugten Entwicklungstechnologien Ihres Teams einen Webhook oder eine Funktion, um komplexere Automatisierungsaktionen zu erstellen. In der Referenzarchitektur der ereignisbasierten Cloudautomatisierung finden Sie ein Beispiel für die Verwendung einer Funktion zum Reagieren auf Datenbankdrosselung. Die Verwendung automatisierter Aktionen kann Ihnen helfen, sich schnell wiederherzustellen und die Notwendigkeit eines menschlichen Eingreifens zu minimieren.

Azure-Erleichterung

Die meisten Azure-Dienste und Client-SDKs enthalten einen Wiederholungsmechanismus. Sie unterscheiden sich jedoch, da jeder Dienst unterschiedliche Merkmale und Anforderungen aufweist, sodass jeder Wiederholungsmechanismus auf einen bestimmten Dienst abgestimmt ist. Weitere Informationen finden Sie unter Empfehlungen zur Behandlung vorübergehender Fehler.

Verwenden Sie Azure Monitor-Aktionsgruppen für Benachrichtigungen wie E-Mail, Sprachnachricht oder SMS und zum Auslösen automatisierter Aktionen. Wenn Sie über einen Fehler benachrichtigt werden, lösen Sie ein Azure Automation Runbook, Azure Event Hubs, eine Azure-Funktion, eine Logik-App oder einen Webhook aus, um eine automatisierte Heilungsaktion auszuführen.

Überlegungen

Machen Sie sich mit den Überlegungen für die einzelnen Muster vertraut. Stellen Sie sicher, dass das Muster vor der Implementierung für Ihre Workload- und Geschäftsanforderungen geeignet ist.

Beispiel

Beispiele für Anwendungsfälle einiger Muster finden Sie im zuverlässigen Web-App-Muster für .NET. Führen Sie die folgenden Schritte aus, um eine Referenzimplementierung bereitzustellen.

Prüfliste für zuverlässigkeit

Weitere Informationen finden Sie im vollständigen Satz von Empfehlungen.