Empfehlungen für Selbstheilung und Selbsterhaltung

Gilt für diese Empfehlung für die Zuverlässigkeitsprüfliste des Azure Well-Architected Framework:

RE:07 Stärken Sie die Widerstandsfähigkeit und Wiederherstellbarkeit Ihrer Workload durch die Implementierung von Selbsterhaltungs- und Selbstheilungsmaßnahmen. Erstellen 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 Lösungskomponentenfehler zu erkennen und automatisch Korrekturmaßnahmen einzuleiten, während die Workload weiterhin vollständig oder reduziert funktioniert.

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

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

Selbsterhaltungsfunktionen machen Ihre Workload widerstandsfähiger. Sie verringern die Wahrscheinlichkeit eines vollständigen Ausfalls und ermöglichen es Ihrer Workload, in einem beeinträchtigten Zustand zu arbeiten, während die ausgefallenen Komponenten wiederhergestellt werden. Selbstheilungsfunktionen helfen Ihnen, Downtime zu vermeiden, indem sie eine Fehlererkennung und automatische Korrekturmaßnahmen für verschiedene Fehlertypen einbauen.

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

Definitionen

Begriff Definition
Selbstreparatur Die Fähigkeit Ihrer Workload, Probleme automatisch zu beheben, indem betroffene Komponenten wiederhergestellt werden und bei Bedarf eine redundante Infrastruktur fehlschlägt.
Selbsterhaltung Die Fähigkeit Ihrer Arbeitsauslastung, gegen potenzielle Probleme widerstandsfähig zu sein.

Wichtige Entwurfsstrategien

Design zur Selbsterhaltung

Um Ihre Arbeitsauslastung für die selbsterhaltung zu entwerfen, folgen Sie den Entwurfsmustern der Infrastruktur und der Anwendungsarchitektur, um die Ausfallsicherheit Ihrer Workload zu optimieren. Um die Wahrscheinlichkeit eines vollständigen Anwendungsausfalls zu minimieren, erhöhen Sie die Ausfallsicherheit 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 erfüllen.

Anleitungen und Muster für den Infrastrukturentwurf

Auf Infrastrukturebene sollte ein redundantes Architekturdesign Ihre kritischen Flüsse unterstützen, wobei ressourcenübergreifend in Verfügbarkeitszonen oder Regionen bereitgestellt werden. Implementieren Sie die automatische Skalierung nach Möglichkeit. Die Automatische Skalierung trägt dazu bei, Ihre Arbeitsauslastung vor unerwarteten Brüchen in der Aktivität zu schützen und Ihre Infrastruktur weiter zu stärken.

Verwenden Sie das Bereitstellungsstempelmuster oder das Bulkhead-Muster, um den Strahlradius zu minimieren, wenn Probleme auftreten. Diese Muster helfen, Ihre Arbeitsauslastung verfügbar zu halten, wenn eine einzelne Komponente nicht verfügbar ist. Verwenden Sie die folgenden Anwendungsentwurfsmuster in Kombination mit Ihrer automatischen Skalierungsstrategie.

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

  • Bulkhead-Muster: Partitionieren Sie Dienstinstanzen in verschiedene Gruppen, die als Pools bezeichnet werden, basierend auf den Anforderungen an die Auslastung und Verfügbarkeit des Verbrauchers. Dieses Design hilft beim Isolieren von Fehlern und ermöglicht es Ihnen, die Dienstfunktionalität für einige Verbraucher aufrechtzuerhalten, auch während eines Fehlers.

Anleitungen und Muster für den Anwendungsentwurf

Vermeiden Sie den Aufbau monolithischer Anwendungen in Ihrem Anwendungsentwurf. Verwenden Sie lose gekoppelte Dienste oder Microservices, die über gut definierte Standards miteinander kommunizieren, um das Risiko umfangreicher Probleme zu reduzieren, wenn Störungen mit einer einzelnen Komponente auftreten. Sie können z. B. die Verwendung eines Servicebus standardisieren, um alle asynchrone Kommunikation zu verarbeiten. Durch die Standardisierung von Kommunikationsprotokollen wird sichergestellt, dass das Entwerfen von Anwendungen konsistent und vereinfacht ist, wodurch die Arbeitsauslastung zuverlässiger und einfacher zu beheben ist, wenn Fehlfunktionen auftreten. Wenn dies praktisch ist, bevorzugen Sie die asynchrone Kommunikation zwischen Komponenten über synchrone Kommunikation, um Timeoutprobleme wie "Dead Lettering" zu minimieren. Mit den folgenden Entwurfsmustern können Sie Ihre Arbeitsauslastung organisieren und die Kommunikation zwischen Komponenten auf eine Weise definieren, die Ihren Geschäftlichen Anforderungen am besten entspricht.

  • Botschaftermuster: 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 Schaltkreisbrüche zu implementieren.

  • Asynchrones Anforderungsantwortmuster: Decouple back-end processing from a front-end host if back-end processing needs to be asynchron, but the front end needs a clear response.

  • Cache-Aside-Muster: Laden von Daten bei Bedarf aus einem Datenspeicher in einen Cache. Dieses Muster kann die Leistung verbessern und dabei helfen, die Konsistenz zwischen daten zu gewährleisten, die im Cache gespeichert sind, und Daten, die sich im zugrunde liegenden Datenspeicher befinden.

  • Schaltkreisbrechermuster: Verwenden Sie Schaltkreisbrecher, um proaktiv zu bestimmen, ob ein Vorgang fortgesetzt oder eine Ausnahme basierend auf der Anzahl der zuletzt aufgetretenen 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. Mit diesem Muster können große Nachrichten verarbeitet werden, während der Nachrichtenbus geschützt und verhindert wird, dass der Client überfordert oder verlangsamt wird.

  • Konkurrierende Verbrauchermuster: Ermöglichen Sie mehreren gleichzeitigen Verbrauchern, 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 wird, und die Arbeitsauslastung ausgeglichen wird.

  • Konfigurieren von Anforderungstimeouts: Konfigurieren von Anforderungstimeouts für Anrufe an Dienste oder Datenbanken. Timeouts für Datenbankverbindungen werden in der Regel auf 30 Sekunden festgelegt.

  • Gatekeeper-Muster: Schützen Sie Anwendungen und Dienste mithilfe einer dedizierten Hostinstanz, um Anforderungen zwischen Clients und der Anwendung oder dem Dienst zu brokern. Der Broker überprüft und sanitiert die Anforderungen und kann eine zusätzliche Sicherheitsebene bereitstellen, um die Angriffsfläche des Systems zu begrenzen.

  • Warteschlangenbasiertes Lastenausgleichsmuster: Decoupieren Sie die Aufgaben vom Dienst in Ihrer Lösung, indem Sie eine Warteschlange zwischen ihnen verwenden, damit sie asynchron ausgeführt werden können. Verwenden Sie eine Warteschlange als Puffer zwischen einem Vorgang und einem Dienst, der aufgerufen wird, um unterbrechungsfreie schwere Lasten zu erleichtern, die dazu führen können, dass der Dienst fehlschlägt oder der Vorgang timeout ist. Dieses Muster kann dazu beitragen, die Auswirkungen von Spitzen bei Bedarf auf Verfügbarkeit und Reaktionsfähigkeit für den Vorgang und den Dienst zu minimieren.

  • Einschränkungsmuster: Steuern sie den Verbrauch von Ressourcen, die von einer Instanz einer Anwendung, einem einzelnen Mandanten oder einem gesamten Dienst verwendet werden. Dieses Muster ermöglicht es dem System, weiterhin zu funktionieren und Vereinbarungen auf Service-Level-Vereinbarungen (Service Level Agreements, SLAs) zu erfüllen, auch wenn eine Zunahme der Nachfrage eine extreme Belastung für Ressourcen stellt.

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

Hintergrundaufträge

Hintergrundaufträge sind eine effektive Möglichkeit, die Zuverlässigkeit eines Systems durch Entkoppeln von Aufgaben von der Benutzeroberfläche zu verbessern. Implementieren Sie eine Aufgabe als Hintergrundauftrag, wenn keine Benutzereingabe oder Feedback erforderlich ist und sich die Reaktionsfähigkeit der Benutzeroberfläche nicht 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. das regelmäßige Aktualisieren von Daten oder die Verarbeitung von Vorgängen zu einem bestimmten Zeitpunkt.
  • Lange ausgeführte Workflows, z. B. Das Abschließen einer Bestellung oder bereitstellungsdienste und -systeme.

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

Entwurf mit Blick auf Selbstreparatur

Um Ihre Workload für die Selbstheilung zu entwerfen, implementieren Sie die Fehlererkennung, sodass automatische Antworten ausgelöst und kritische Flüsse ordnungsgemäß wiederhergestellt werden. Ermöglichen Sie die Protokollierung, um operative Einblicke über die Art des Fehlers und den Erfolg der Wiederherstellung zu liefern. Die Ansätze, die Sie zum Erreichen der Selbstheilung für einen kritischen Fluss ergreifen, hängen von den Zuverlässigkeitszielen ab, die für diesen Fluss und die Komponenten und Abhängigkeiten des Flusses definiert sind.

Richtlinien für den Infrastrukturentwurf

Auf Infrastrukturebene sollten Ihre kritischen Flüsse durch einen redundanten Architekturentwurf unterstützt werden, wobei ein automatisiertes Failover für Komponenten aktiviert ist, die sie unterstützen. Sie können automatisiertes Failover für die folgenden Arten von Diensten aktivieren:

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

  • Datenbanken: Relationale Datenbanken können für automatisches Failover mit Lösungen wie Azure SQL-Failoverclustern, AlwaysOn-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 sie schlechte Akteure: Wenn Sie einen Client drosseln, bedeutet dies nicht, dass der Client böswillig handelt. Es kann bedeuten, dass der Client sein Dienstkontingent überschritten hat. Wenn ein Client ihr Kontingent jedoch 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 das Aufheben der Blockierung anzufordern.

  • Schaltkreisbrechermuster: Wenn ein Fehler nach dem Initiieren des Wiederholungsmechanismus weiterhin besteht, riskieren Sie kaskadierende Fehler, die sich aus einem wachsenden Rückstau von Anrufen ergeben. Ein Schaltkreisschalter, der für die Arbeit mit dem Wiederholungsmechanismus entwickelt wurde, beschränkt das Risiko von Kaskadierungsfehlern, indem verhindert wird, dass die App wiederholt versucht, einen Vorgang auszuführen, der wahrscheinlich fehlschlägt.

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

  • Herabsetzen sie ordnungsgemäß: Manchmal können Sie ein Problem nicht umgehen, aber Sie können eingeschränkte Funktionen 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 die Anzeige von Produktempfehlungen für eine E-Commerce-Website wahrscheinlich weniger kritisch als die Verarbeitung von Bestellungen. Eine ordnungsgemäße Beeinträchtigung kann auch automatische Failovervorgänge umfassen. Wenn eine Datenbank aufgrund eines Problems mit der primären Instanz automatisch zu einem Replikat fehlschlägt, wird die Leistung für kurze Zeit beeinträchtigt.

  • Führungswahlmuster: Wenn Sie eine Aufgabe koordinieren müssen, wählen Sie einen Koordinator aus, damit ein Koordinator kein einziger Fehlerpunkt ist. Wenn der Koordinator ausfällt, wird ein neuer ausgewählt. Anstatt einen Führungswahlalgorithmus von Grund auf neu zu implementieren, sollten Sie eine standardfreie Lösung, z . B. ZooKeeper, in Betracht ziehen.

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

  • Verwenden Sie Prüfpunkte für lange ausgeführte Transaktionen: Prüfpunkte können Resilienz bieten, wenn ein langer Vorgang fehlschlägt. Wenn der Vorgang neu gestartet wird, z. B. wenn er von einem anderen virtuellen Computer abgerufen wird, kann er vom letzten Prüfpunkt fortgesetzt werden. Erwägen Sie die Implementierung eines Mechanismus, mit dem Statusinformationen über den Vorgang in regelmäßigen Abständen aufgezeichnet werden. Speichern Sie diesen Zustand im dauerhaften Speicher, auf den von jeder Instanz des Prozesses zugegriffen werden kann, der die Aufgabe ausführt. Wenn der Prozess heruntergefahren wird, kann die ausgeführte Arbeit mithilfe einer anderen Instanz vom letzten Prüfpunkt 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 Statusänderungen erkannt werden. Wenn Ihre Überwachung beispielsweise erkennt, dass eine Web-App nicht auf Anforderungen reagiert, können Sie die Automatisierung über ein PowerShell-Skript erstellen, um den App-Dienst neu zu starten. Abhängig von den Fähigkeiten Ihres Teams und bevorzugten Entwicklungstechnologien verwenden Sie einen Webhook oder eine Funktion, um komplexere Automatisierungsaktionen zu erstellen. Ein Beispiel für die Verwendung einer Funktion zum Reagieren auf datenbankeinschränkung finden Sie in der ereignisbasierten Cloudautomatisierungs-Referenzarchitektur . Die Verwendung automatisierter Aktionen kann Ihnen helfen, schnell wiederherzustellen und die Notwendigkeit eines menschlichen Eingriffs 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 für die vorübergehende Fehlerbehandlung.

Verwenden Sie Azure Monitor-Aktionsgruppen für Benachrichtigungen, z. B. E-Mails, Sprachnachrichten oder SMS, und um automatisierte Aktionen auszulösen. 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 jedes 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.

Zuverlässigkeitsprüfliste

Lesen Sie den vollständigen Satz von Empfehlungen.