Skalierbare und robuste Anwendungen erstellen

In diesem Dokument werden einige Muster und Vorgehensweisen zum Erstellen von stabilen und skalierbaren Anwendungen erläutert – zwei wesentliche Ziele vieler moderner Architekturen. Eine gut konzipierte Anwendung lässt sich bei steigender Nachfrage hochskalieren und bei abnehmender Nachfrage wieder herunterskalieren. Außerdem ist sie stabil genug, um Dienstunterbrechungen zu überstehen. Das Erstellen und Betreiben von Anwendungen, die diese Anforderungen erfüllen, erfordert eine sorgfältige Planung und Gestaltung.

Skalierbarkeit: Kapazitäten an Nachfrage anpassen

Die Skalierbarkeit ist ein Maß für die Fähigkeit eines Systems, durch das Hinzufügen oder Entfernen von Ressourcen unterschiedlich große Aufgaben zu bewältigen. Eine skalierbare Webanwendung funktioniert beispielsweise sowohl mit einem Nutzer als auch mit mehreren Nutzern zufriedenstellend und bewältigt Spitzen und Einbrüche im Traffic.

Die Flexibilität, die von einer Anwendung verbrauchten Ressourcen anzupassen, ist ein wichtiger Geschäftsgrund für den Wechsel in die Cloud. Mit der richtigen Architektur können Sie die Kosten senken, indem Sie nicht ausgelastete Ressourcen entfernen, ohne die Leistung oder Nutzerfreundlichkeit zu beeinträchtigen. In Zeiten mit hohem Traffic können Sie dagegen eine gute Nutzerfreundlichkeit gewährleisten, indem Sie weitere Ressourcen hinzufügen. So verbraucht Ihre Anwendung nur die für die Nachfrage erforderlichen Ressourcen.

Google Cloud bietet Produkte und Funktionen, mit denen Sie skalierbare, effiziente Anwendungen erstellen können:

  • Virtuelle Maschinen von Compute Engine sowie Cluster in Google Kubernetes Engine (GKE) lassen sich in Autoscaling einbinden. Damit können Sie den Ressourcenverbrauch je nach von Ihnen festgelegten Messwerten erhöhen oder verringern.
  • Die serverlose Plattform von Google Cloud bietet verwaltete Computing-, Datenbank- und andere Dienste, die schnell von null auf ein hohes Anfragevolumen skaliert werden. Sie bezahlen nur für das, was Sie tatsächlich nutzen.
  • Datenbankprodukte wie BigQuery, Cloud Spanner und Cloud Bigtable bieten auch bei sehr großen Datenmengen eine konsistente Leistung.
  • Cloud Monitoring stellt Messwerte für Ihre Anwendungen und Infrastruktur zur Verfügung und hilft Ihnen dabei, datengestützte Skalierungsentscheidungen zu treffen.

Ausfallsicherheit: Entwickeln, um Fehlern standzuhalten

Eine robuste Anwendung funktioniert auch, wenn Systemkomponenten ausfallen. Ausfallsicherheit erfordert Planung auf allen Ebenen Ihrer Architektur. Sie beeinflusst, wie Sie Ihre Infrastruktur und Ihr Netzwerk gestalten und wie Sie Ihre Anwendung und Ihren Datenspeicher entwerfen.

Das Erstellen und Betreiben stabiler Anwendungen ist schwierig. Dies gilt insbesondere für verteilte Anwendungen, die mehrere Ebenen von Infrastruktur, Netzwerken und Diensten enthalten können. Fehler und Ausfälle treten auf und die Verbesserung der Ausfallsicherheit Ihrer Anwendung ist ein fortlaufender Prozess. Mit einer sorgfältigen Planung können Sie die Ausfallsicherheit Ihrer Anwendung verbessern. Mit geeigneten Prozessen und Organisationskultur können Sie auch aus Fehlern lernen, um die Ausfallsicherheit Ihrer Anwendung weiter zu erhöhen.

Google Cloud bietet Tools und Dienste, mit denen Sie hochverfügbare und stabile Anwendungen erstellen können:

  • Google Cloud-Dienste sind weltweit in Regionen und Zonen verfügbar, damit Sie Ihre Anwendung so bereitstellen können, dass sie Ihre Verfügbarkeitsziele am besten erfüllt.
  • Compute Engine-Instanzgruppen und GKE-Cluster können auf die verfügbaren Zonen in einer Region verteilt und verwaltet werden.
  • Regionale nichtflüchtige Speicher von Compute Engine werden synchron über Zonen in einer Region repliziert.
  • Google Cloud bietet eine Reihe von Load-Balancing-Optionen zur Verwaltung Ihres Anwendungstraffics, einschließlich des globalen Load-Balancings, das Traffic an eine intakte Region weiterleiten kann, die Ihren Nutzern am nächsten ist.
  • Die serverlose Plattform von Google Cloud umfasst verwaltete Computing- und Datenbankprodukte mit integrierter Redundanz und Load Balancing.
  • Google Cloud unterstützt CI/CD durch native Tools und Einbindungen in gängige Open-Source-Technologien, um die Erstellung und Bereitstellung Ihrer Anwendungen zu automatisieren.
  • Cloud Monitoring stellt Messwerte für Ihre Anwendungen und Infrastruktur bereit und hilft Ihnen dabei, datengestützte Skalierungsentscheidungen zu treffen.

Erfolgsfaktoren und Einschränkungen

Es gibt verschiedene Anforderungen und Motivationen, um die Skalierbarkeit und Robustheit Ihrer Anwendung zu verbessern. Möglicherweise gibt es auch Einschränkungen, die Sie daran hindern, Ihre Skalierbarkeits- und Ausfallsicherheitsziele zu erreichen. Die relative Bedeutung dieser Anforderungen und Einschränkungen hängt vom Anwendungstyp, vom Profil Ihrer Nutzer sowie vom Umfang und der Ausgereiftheit Ihrer Organisation ab.

Erfolgsfaktoren

Berücksichtigen Sie bei der Priorisierung Ihrer Anforderungen die Erfolgsfaktoren aus den verschiedenen Bereichen Ihrer Organisation.

Unternehmerische Erfolgsfaktoren

Zu den häufigsten Faktoren auf Unternehmensseite gehören:

  • Optimieren Sie Kosten und Ressourcenverbrauch.
  • Minimieren Sie die Ausfallzeiten der Anwendungen.
  • Achten Sie darauf, dass die Nachfrage der Nutzer auch in Zeiten hoher Auslastung erfüllt werden kann.
  • Verbessern Sie Qualität und Verfügbarkeit von Diensten.
  • Sorgen Sie dafür, dass die Nutzerfreundlichkeit und das Vertrauen bei Ausfällen gewahrt bleiben.
  • Erhöhen Sie die Flexibilität und Agilität, um den sich ändernden Marktanforderungen gerecht zu werden.

Erfolgsfaktoren für die Entwicklung

Zu den häufigsten Faktoren auf Entwicklungsseite gehören:

  • Minimieren Sie den Zeitaufwand für die Untersuchung von Ausfällen.
  • Erhöhen Sie den Zeitaufwand für die Entwicklung neuer Funktionen.
  • Minimieren Sie sich wiederholende Aufgaben durch Automatisierung.
  • Erstellen Sie Anwendungen mit den neuesten Mustern und Praktiken der Branche.

Erfolgsfaktoren für den Betrieb

Für den Betrieb sind unter anderem folgende Anforderungen zu beachten:

  • Reduzieren Sie die Häufigkeit von Fehlern, die ein manuelles Eingreifen erfordern.
  • Verbessern Sie die Möglichkeit der Wiederherstellung nach Ausfällen.
  • Minimieren Sie sich wiederholende Aufgaben durch Automatisierung.
  • Minimieren Sie die Auswirkungen des Ausfalls einer bestimmten Komponente.

Einschränkungen

Einschränkungen können die Skalierbarkeit und Ausfallsicherheit Ihrer Anwendung einschränken. Achten Sie darauf, dass Ihre Designentscheidungen nicht zu diesen Einschränkungen führen oder zu diesen beitragen:

  • Abhängigkeiten von schwer skalierbarer Hardware oder Software.
  • Abhängigkeiten von Hardware oder Software, die in einer Hochverfügbarkeitskonfiguration schwierig zu bedienen sind.
  • Abhängigkeiten zwischen Anwendungen.
  • Lizenzbeschränkungen.
  • Fehlende Kenntnis oder Erfahrung in Ihren Entwicklungs- und Betriebsteams.
  • Organisatorischer Schutz vor Automatisierung.

Muster und Vorgehensweisen

Im weiteren Verlauf dieses Dokuments werden Muster und Vorgehensweisen zur Erstellung robuster und skalierbarer Anwendungen beschrieben. Diese Muster betreffen alle Teile Ihres Anwendungslebenszyklus, einschließlich des Infrastrukturdesigns, der Anwendungsarchitektur, der Speicherauswahl, der Bereitstellungsprozesse und der Organisationskultur.

In den Mustern sind drei Themen zu erkennen:

  • Automation. Das Erstellen skalierbarer und stabiler Anwendungen erfordert Automatisierung. Die Automatisierung von Infrastrukturbereitstellung, Tests und Anwendungs-Deployment erhöht die Konsistenz und Geschwindigkeit und minimiert menschliche Fehler.
  • Lose Kopplung. Wenn Sie Ihr System als eine Sammlung von locker gekoppelten, unabhängigen Komponenten behandeln, sind Flexibilität und Ausfallsicherheit möglich. Mit "Unabhängigkeit" wird beschrieben, wie Sie Ihre Ressourcen räumlich verteilen, Ihre Anwendung planen und Ihren Speicher entwerfen.
  • Datengestützes Design. Zum Verständnis Ihrer Anwendung ist es wichtig, Messwerte zu erfassen. Entscheidungen darüber, wann Ihre Anwendung skaliert werden soll oder ob ein bestimmter Dienst fehlerhaft ist, müssen auf Daten basieren. Messwerte und Logs sollten Kernfunktionen sein.

Infrastrukturbereitstellung automatisieren

Erstellen Sie eine unveränderliche Infrastruktur durch Automatisierung, um die Konsistenz Ihrer Umgebungen zu verbessern und den Erfolg Ihrer Deployments zu steigern.

Infrastruktur wie Code behandeln

Infrastructure as Code (IaC) ist eine Technik, mit der Sie Ihre Infrastrukturbereitstellung und -konfiguration genauso wie Anwendungscode behandeln können. Ihre Bereitstellungs- und Konfigurationslogik wird in der Versionsverwaltung gespeichert, damit sie auffindbar ist und versioniert und geprüft werden kann. Da es sich um ein Code-Repository handelt, können Sie CI-/CD-Pipelines (Continuous Integration/Continuous Deployment) nutzen, damit Änderungen an Ihrer Konfiguration automatisch getestet und bereitgestellt werden können.

Durch das Entfernen manueller Schritte aus der Infrastrukturbereitstellung minimiert IaC menschliche Fehler und verbessert die Konsistenz und Reproduzierbarkeit Ihrer Anwendungen und Umgebungen. Auf diese Weise erhöht IaC die Ausfallsicherheit Ihrer Anwendungen.

Mit Cloud Deployment Manager können Sie die Erstellung und Verwaltung von Google Cloud-Ressourcen mit flexiblen Vorlagen automatisieren. Google Cloud unterstützt auch beliebte IaC-Tools von Drittanbietern wie Terraform, Chef und Puppet. Weitere Informationen finden Sie auf der Lösungsseite Infrastruktur als Code.

Unveränderliche Infrastruktur erstellen

Die unveränderliche Infrastruktur ist eine Strategie, die auf den Vorteilen der Infrastruktur als Code aufbaut. Eine unveränderliche Infrastruktur erfordert, dass Ressourcen nach der Bereitstellung nicht mehr geändert werden. Wenn eine virtuelle Maschine, ein Kubernetes-Cluster oder eine Firewallregel aktualisiert werden muss, können Sie die Konfiguration der Ressource im Quell-Repository aktualisieren. Stellen Sie die Ressource mit der neuen Konfiguration noch einmal vollständig bereit, nachdem Sie die Änderungen getestet und validiert haben Mit anderen Worten: Sie müssen Ressourcen nicht neu einstellen, sondern neu erstellen.

Das Erstellen einer unveränderlichen Infrastruktur führt zu besser vorhersehbaren Bereitstellungen und Rollbacks. Außerdem werden Probleme minimiert, die in änderbaren Infrastrukturen häufig vorkommen, z. B. Konfigurationsabweichungen und Snow Flake-Server. Auf diese Weise verbessert die Einführung einer unveränderlichen Infrastruktur die Konsistenz und Zuverlässigkeit Ihrer Umgebungen.

Hochverfügbarkeit bereitstellen

Die Verfügbarkeit ist ein Maß für die Betriebszeit eines Systems. In Softwaresystemen wird Hochverfügbarkeit normalerweise durch redundante Bereitstellung von Komponenten erreicht. Einfach ausgedrückt umfassen hochverfügbare Architekturen normalerweise die Verteilung von Rechenressourcen, das Load-Balancing und die Replikation von Daten.

Ressourcen räumlich verteilen

Google Cloud-Dienste sind weltweit verfügbar. Die verschiedenen Standorte sind in Regionen und Zonen aufgeteilt. Wie Sie Ihre Anwendung in diesen Regionen und Zonen bereitstellen, wirkt sich auf die Verfügbarkeit, Latenz und andere Eigenschaften Ihrer Anwendung aus. Weitere Informationen finden Sie unter Best Practices für die Auswahl der Region in Compute Engine.

Redundanz ist die Duplizierung von Komponenten eines Systems, um die Gesamtverfügbarkeit dieses Systems zu erhöhen. In Google Cloud wird Redundanz in der Regel durch die Bereitstellung Ihrer Anwendung oder Ihres Dienstes in mehreren Zonen oder sogar in mehreren Regionen erreicht. Wenn ein Dienst in mehreren Zonen oder Regionen vorhanden ist, kann er Dienstunterbrechungen in einer bestimmten Zone oder Region besser standhalten. Obwohl Google Cloud alles unternimmt, um solche Unterbrechungen zu vermeiden, sind bestimmte Ereignisse unvorhersehbar, und man sollte am besten vorbereitet sein.

Mit verwalteten Instanzgruppen von Compute Engine können Sie VM-Instanzen auf mehrere Zonen in einer Region verteilen und die Instanzen als logische Einheit verwalten. Google Cloud bietet auch regionale nichtflüchtige Speicher, um Ihre Daten automatisch in zwei Zonen in einer Region zu replizieren.

In ähnlicher Weise können Sie die Verfügbarkeit und Ausfallsicherheit Ihrer in GKE bereitgestellten Anwendungen verbessern, indem Sie regionale Cluster erstellen. Ein regionaler Cluster verteilt GKE-Master, -Knoten und -Pods auf mehrere Zonen innerhalb einer Region. Da Ihre Master verteilt sind, können Sie auch bei einem Ausfall einer oder mehrerer (aber nicht aller) Zonen weiterhin auf die Steuerungsebene des Clusters zugreifen.

Verwaltete Dienste nutzen

Anstatt alle Teile Ihres Anwendungsstapels unabhängig zu installieren, zu unterstützen und zu betreiben, können Sie verwaltete Dienste verwenden, um Teile Ihres Anwendungs-Stacks als Dienste zu nutzen. Anstatt beispielsweise eine MySQL-Datenbank auf virtuellen Maschinen (VMs) zu installieren und zu verwalten, können Sie stattdessen eine von Cloud SQL bereitgestellte MySQL-Datenbank verwenden. Sie erhalten dann ein Service Level Agreement (SLA) für die Verfügbarkeit und können sich darauf verlassen, dass Google Cloud Datenreplikation, Sicherungen und die zugrunde liegende Infrastruktur verwaltet. Durch die Verwendung verwalteter Dienste können Sie weniger Zeit für die Verwaltung der Infrastruktur und mehr Zeit für die Verbesserung der Zuverlässigkeit Ihrer Anwendung aufwenden.

Viele der verwalteten Compute-, Datenbank- und Speicherdienste von Google Cloud bieten integrierte Redundanz, mit der Sie Ihre Verfügbarkeitsziele erreichen können. Viele dieser Dienste bieten ein regionales Modell. Das heißt, die Infrastruktur, die Ihre Cloud Run-Dienste ausführt, befindet sich in einer bestimmten Region und wird von Google verwaltet, damit die Dienste in allen Zonen innerhalb der Region redundant verfügbar sind. Wenn eine Zone nicht mehr verfügbar ist, werden Ihre Anwendung oder Daten automatisch aus einer anderen Zone in der Region bereitgestellt.

Bestimmte Datenbank- und Speicherdienste bieten außerdem multiregionale Verfügbarkeit. Das heißt, die Infrastruktur, in der Ihre Anwendung ausgeführt wird, befindet sich in mehreren Regionen. Multiregionale Dienste können dem Verlust einer ganzen Region standhalten, was jedoch in der Regel mit einer höheren Latenz verbunden ist.

Load-Balancing auf jeder Stufe

Mit dem Load-Balancing können Sie den Traffic auf Ressourcengruppen verteilen. Wenn Sie Traffic verteilen, prüfen Sie, dass einzelne Ressourcen nicht überlastet werden, während andere inaktiv sind. Die meisten Load-Balancer bieten auch Funktionen zur Systemdiagnose, um sicherzustellen, dass der Traffic nicht an fehlerhafte oder nicht verfügbare Ressourcen weitergeleitet wird.

Google Cloud bietet verschiedene Load-Balancing-Optionen. Wenn Ihre Anwendung in Compute Engine oder GKE ausgeführt wird, können Sie je nach Typ, Quelle und anderen Aspekten des Traffics den am besten geeigneten Load-Balancer auswählen. Weitere Informationen finden Sie in der Übersicht zum Load-Balancing und in der GKE-Netzwerkübersicht.

Alternativ können einige von Google Cloud verwaltete Dienste wie App Engine und Cloud Run den Traffic automatisch verteilen.

Es ist üblich, Anfragen von externen Quellen wie Web- oder mobilen Clients zu verteilen. Die Verwendung von Load-Balancern zwischen verschiedenen Diensten oder Ebenen innerhalb Ihrer Anwendung kann jedoch auch die Ausfallsicherheit und Flexibilität erhöhen. Google Cloud bietet zu diesem Zweck internes Load-Balancing auf Ebene 4 und Ebene 7.

Das folgende Diagramm zeigt einen externen Load-Balancer, der den globalen Traffic auf die beiden Regionen us-central1 und asia-east1 verteilt. Außerdem wird das interne Load-Balancing angezeigt, das den Traffic von der Webstufe auf die interne Stufe innerhalb jeder Region verteilt.

Diagramm: Globalen Traffic auf Regionen verteilen

Monitoring von Infrastruktur und Anwendungen

Bevor Sie entscheiden können, wie Sie die Ausfallsicherheit und Skalierbarkeit Ihrer Anwendung verbessern können, müssen Sie ihr Verhalten verstehen. Wenn Sie Zugriff auf eine umfassende Reihe relevanter Messwerte und Zeitachsen zur Leistung und Integrität Ihrer Anwendung haben, können Sie potenzielle Probleme erkennen, bevor sie zu einem Ausfall führen. Sie können Ihnen auch dabei helfen, einen Ausfall zu diagnostizieren und zu beheben. Das Kapitel Verteilte Systeme überwachen im SRE-Buch von Google bietet einen guten Überblick über einige Monitoring-Ansätze.

Mit Messwerten können Sie nicht nur Einblicke in den Zustand Ihrer Anwendung gewinnen, sondern auch das Autoscaling-Verhalten Ihrer Dienste steuern.

Cloud Monitoring ist das integrierte Monitoringtool von Google Cloud. Cloud Monitoring nimmt Ereignisse, Messwerte und Metadaten auf und liefert Informationen über Dashboards und Benachrichtigungen. Die meisten Google Cloud-Dienste senden automatisch Messwerte an Cloud Monitoring und Google Cloud unterstützt auch viele Quellen von Drittanbietern. Cloud Monitoring kann auch als Back-End für gängige Open-Source-Monitoringtools verwendet werden und bietet eine zentrale Oberfläche für die Beobachtung Ihrer Anwendung.

Monitoring auf allen Ebenen

Durch das Erfassen von Messwerten auf verschiedenen Ebenen oder Ebenen innerhalb Ihrer Architektur erhalten Sie ein ganzheitliches Bild vom Zustand und Verhalten Ihrer Anwendung.

Monitoring von Infrastruktur

Das Monitoring auf Infrastrukturebene liefert den Grundzustand und die Leistung Ihrer Anwendung. Dieser Monitoringansatz erfasst Informationen wie CPU-Auslastung, Speichernutzung und die Anzahl der auf das Laufwerk geschriebenen Bytes. Diese Messwerte können darauf hinweisen, dass eine Maschine überlastet ist. Daher kann es erforderlich sein, ein Skalierungsereignis auszulösen oder eine Warnung über ein Problem mit der Maschine zu generieren.

Zusätzlich zu den automatisch erfassten Messwerten bietet Cloud Monitoring einen Agent, der installiert werden kann, um detailliertere Informationen von Compute Engine-VMs zu erfassen, einschließlich Drittanbieteranwendungen, die auf diesen Maschinen ausgeführt werden.

Monitoring von Anwendungen

Wir empfehlen die Erfassung von Messwerten auf Anwendungsebene. Sie können beispielsweise messen, wie lange es dauert, eine bestimmte Abfrage auszuführen, oder wie lange es dauert, eine entsprechende Sequenz von Dienstaufrufen auszuführen. Sie legen diese Messwerte auf Anwendungsebene selbst fest. Sie erfassen Informationen, die die integrierten Cloud Monitoring-Messwerte nicht erfassen können. Mit Messwerten auf Anwendungsebene können Sie zusammengefasste Bedingungen erfassen, die die wichtigsten Workflows besser widerspiegeln, und Probleme aufdecken, die für Infrastrukturmesswerte auf niedriger Ebene nicht gelten.

Außerdem empfehlen wir zur Erfassung von Messwerten auf Anwendungsebene die Verwendung von OpenCensus. OpenCensus ist Open Source, bietet eine flexible API und kann so konfiguriert werden, dass Messwerte in das Cloud Monitoring-Back-End exportiert werden.

Dienstmonitoring

Bei verteilten und auf Mikrodiensten basierenden Anwendungen ist es wichtig, die Interaktionen zwischen den verschiedenen Diensten und Komponenten in Ihren Anwendungen zu überwachen. Mit diesen Messwerten können Sie Probleme wie erhöhte Anzahl von Fehlern oder Latenz zwischen Diensten diagnostizieren, die wiederum eine Warnung oder Skalierung erfordern.

Istio ist ein Open-Source-Tool, das Informationen zum Verhalten und zur Betriebskontrolle Ihres Netzwerks von Mikrodiensten bietet. Istio generiert detaillierte Telemetriedaten für die gesamte Dienstkommunikation und kann so konfiguriert werden, dass die Messwerte an Cloud Monitoring gesendet werden.

End-to-End-Monitoring

Das End-to-End-Monitoring, auch Blackbox-Monitoring genannt, testet extern sichtbares Verhalten so, wie es ein Nutzer sieht. Bei dieser Art des Monitoring wird überprüft, ob ein Nutzer kritische Aktionen innerhalb der definierten Grenzwerte ausführen kann. Dieses grobe Monitoring kann Fehler oder Latenzen aufdecken, die ein genaueres Monitoring möglicherweise nicht ermöglicht, und zeigt die vom Nutzer wahrgenommene Verfügbarkeit an.

Zustand der Anwendung verfügbar machen

Ein hochverfügbares System muss bestimmen können, welche Teile des Systems fehlerfrei sind und ordnungsgemäß funktionieren. Wenn bestimmte Ressourcen fehlerhaft erscheinen, kann das System Anfragen an eine andere Stelle senden. In der Regel umfassen Systemdiagnosen das Abrufen von Daten von einem Endpunkt, um den Status oder die Integrität eines Dienstes zu ermitteln.

Die Systemdiagnose ist eine wichtige Aufgabe der Load-Balancer. Wenn Sie einen Load-Balancer erstellen, der einer Gruppe von VM-Instanzen zugeordnet ist, definieren Sie auch eine Systemdiagnose. Die Systemdiagnose definiert zur Bewertung, ob bestimmte Instanzen weiterhin Traffic erhalten sollen, wie der Load-Balancer mit den VMs kommuniziert. Load-Balancer-Systemdiagnosen können auch zur automatischen Reparatur von Instanzgruppen verwendet werden, sodass fehlerhafte Maschinen neu erstellt werden. Wenn Sie GKE ausführen und externen Traffic über eine eingehende Ressource verteilen, erstellt GKE automatisch entsprechende Systemdiagnosen für den Load-Balancer.

Kubernetes bietet integrierte Unterstützung für Aktivitäts- und Bereitschaftsprüfungen. Diese Tests helfen dem Kubernetes-Orchestrator bei der Entscheidung, wie Pods und Anfragen in Ihrem Cluster verwaltet werden. Wenn Ihre Anwendung in Kubernetes bereitgestellt wird, ist es sinnvoll, den Status Ihrer Anwendung über entsprechende Endpunkte für diese Tests freizugeben.

Wichtige Messwerte festlegen

Monitoring und Systemdiagnosen liefern Messwerte zum Verhalten und Status Ihrer Anwendung. Der nächste Schritt besteht darin, diese Messwerte zu analysieren, um festzustellen, welche am aussagekräftigsten oder wirkungsvollsten sind. Die wichtigsten Messwerte variieren je nach Plattform, auf der die Anwendung bereitgestellt wird, und nach der Arbeit, die die Anwendung ausführt. Einige Teile Ihrer Anwendung können beispielsweise CPU-gebunden sein, während andere E/A-gebunden sind.

Sie werden wahrscheinlich nicht nur einen Messwert finden, der angibt, ob Ihre Anwendung skaliert werden soll oder ob ein bestimmter Dienst fehlerhaft ist. Häufig ist es eine Kombination von Faktoren, die zusammen einen bestimmten Satz von Bedingungen angeben. Mit Cloud Monitoring können Sie zur Erfassung dieser Bedingungen benutzerdefinierte Messwerte erstellen. Im Google SRE-Buch werden vier goldene Signale für das Monitoring eines nutzerseitigen Systems empfohlen: Latenz, Traffic, Fehler und Sättigung.

Berücksichtigen Sie auch Ihre Toleranz gegenüber Ausreißern. Die Verwendung eines Durchschnitts- oder Medianwerts zum Messen von Zustaand oder Leistung ist möglicherweise nicht die beste Wahl, da diese Messwerte große Ungleichgewichte ausblenden können. Daher ist es wichtig, die Messwert-Verteilung zu berücksichtigen. Das 99. Perzentil ist möglicherweise aussagekräftiger als der Durchschnitt.

Messwerte speichern

Messwerte aus Ihrem Monitoring-System sind kurzfristig nützlich, um bei Systemdiagnosen in Echtzeit zu helfen oder um aktuelle Probleme zu untersuchen. Cloud Monitoring speichert Ihre Messwerte mehrere Wochen, um diese Anwendungsfälle bestmöglich zu erfüllen.

Es ist jedoch auch sinnvoll, Monitoringmesswerte für eine längerfristige Analyse zu speichern. Wenn Sie Zugriff auf einen historischen Datensatz haben, können Sie Ihre Anwendungsarchitektur mit einem datengestützten Ansatz optimieren. Sie können während und nach einem Ausfall erfasste Daten verwenden, um Engpässe und Interdependenzen in Ihren Anwendungen zu identifizieren. Sie können die Daten auch zum Erstellen und Validieren aussagekräftiger Tests verwenden.

Anhand von Verlaufsdaten lässt sich auch prüfen, ob Ihre Anwendung Geschäftsziele in wichtigen Zeiträumen unterstützt. Anhand der Daten können Sie beispielsweise analysieren, wie Ihre Anwendung bei Werbeaktionen mit hohem Traffic in den letzten Quartalen oder sogar Jahren skaliert wurde.

Weitere Informationen zum Exportieren und Speichern von Messwerten finden Sie in der Lösung zum Messwertexport in Cloud Monitoring.

Skalierungsprofil ermitteln

Sie möchten, dass Ihre Anwendung die Nutzerfreundlichkeit und die Leistungsziele ohne Überdimensionierung von Ressourcen erfüllt.

Das folgende Diagramm zeigt eine vereinfachte Darstellung des Skalierungsprofils einer Anwendung. Die Anwendung verwaltet eine grundlegende Ressourcenebene und verwendet Autoscaling, um auf Bedarfsänderungen zu reagieren.

Diagramm: Skalierungsprofil einer Anwendung

Kosten und Nutzerfreundlichkeit ausgeglichen gestalten

Bei der Entscheidung, ob Ihre Anwendung skaliert werden soll, geht es vor allem um den Ausgleich zwischen Kosten und Nutzerfreundlichkeit. Entscheiden Sie, welche Mindestleistung Sie zulassen möchten, und legen Sie gegebenenfalls eine Obergrenze fest. Diese Grenzwerte variieren je nach Anwendung und möglicherweise auch für verschiedene Komponenten oder Dienste innerhalb einer einzelnen Anwendung.

Beispielsweise kann eine für Nutzer bestimmte Web- oder mobile Anwendung strenge Latenzziele haben. Studien zeigen, dass sich selbst kleine Verzögerungen negativ auf die Wahrnehmung Ihrer Anwendung auswirken können, was zu weniger Konvertierungen und Anmeldungen führt. Daher ist es wichtig, dass Ihre Anwendung über ausreichend Bereitstellungskapazität verfügt, um schnell auf Nutzeranfragen reagieren zu können. In diesem Fall sind die höheren Kosten für die Ausführung weiterer Webserver gerechtfertigt.

Das Preis-Leistungs-Verhältnis kann für eine nicht geschäftskritische interne Anwendung, in der Nutzer kleine Verzögerungen wahrscheinlich eher ertragen, anders sein. Daher kann Ihr Skalierungsprofil weniger aggressiv sein. In diesem Fall ist es möglicherweise wichtiger, die Kosten niedrig zu halten, als die Nutzerfreundlichkeit zu optimieren.

Referenzressourcen festlegen

Eine weitere wichtige Komponente Ihres Skalierungsprofils ist die Auswahl eines geeigneten Mindestsatzes von Ressourcen.

Virtuelle Compute Engine-Maschinen oder GKE-Cluster benötigen normalerweise Zeit zum Hochskalieren, da neue Knoten erstellt und initialisiert werden müssen. Daher kann es erforderlich sein, eine Mindestmenge von Ressourcen beizubehalten, auch wenn kein Traffic vorhanden ist. Auch hier wird der Umfang der Basisressourcen vom Typ der Anwendung und des Trafficprofils beeinflusst.

Umgekehrt sind serverlose Technologien wie App Engine, Cloud Functions und Cloud Run darauf ausgelegt, auf null zu skalieren und selbst bei einem Kaltstart schnell zu starten und zu skalieren. Je nach Anwendungstyp und Trafficprofil können diese Technologien für Teile Ihrer Anwendung effizienter sein.

Autoscaling konfigurieren

Mit Autoscaling können Sie die Rechenressourcen Ihrer Anwendung automatisch skalieren. In der Regel erfolgt die automatische Skalierung, wenn bestimmte Messwerte überschritten oder Bedingungen erfüllt werden. Wenn beispielsweise die Anfragelatenzen Ihrer Webstufe einen bestimmten Wert überschreiten, können Sie automatisch weitere Maschinen hinzufügen, um die Bereitstellungskapazität zu erhöhen.

Viele Computing-Produkte von Google Cloud haben Autoscaling-Funktionen. Serverlose verwaltete Dienste wie Cloud Run, Cloud Functions und App Engine sind auf eine schnelle Skalierung ausgelegt. Diese Dienste bieten normalerweise Konfigurationsoptionen, um das Autoscaling-Verhalten einzuschränken oder zu beeinflussen, aber im Allgemeinen bleibt ein Großteil des Autoscaling-Verhaltens für den Operator verborgen.

Compute Engine und GKE bieten mehr Optionen zur Steuerung des Skalierungsverhaltens. Mit Compute Engine können Sie basierend auf verschiedenen Eingaben skalieren, einschließlich benutzerdefinierter Messwerte und der Bereitstellungskapazität des Load-Balancers. Sie können Mindest- und Höchstgrenzen für das Skalierungsverhalten festlegen und mehrere Skalierungsrichtlinien für verschiedene Szenarien definieren. Wie bei GKE können Sie das Cluster-Autoscaling so konfigurieren, dass Knoten basierend auf Arbeitslast- oder Pod-Messwerten oder externen Messwerten dem Cluster hinzugefügt oder entfernt werden.

Wir empfehlen Ihnen, das Autoscaling-Verhalten auf der Grundlage wichtiger Anwendungsmesswerte, Ihres Kostenprofils und Ihrer definierten Mindestanforderungen an Ressourcen zu konfigurieren.

Startzeit minimieren

Damit die Skalierung effektiv ist, muss sie schnell genug erfolgen, um die zunehmende Last zu bewältigen. Dies gilt insbesondere beim Hinzufügen von Rechen- oder Bereitstellungskapazität.

Vorgefertigte Images verwenden

Wenn Ihre Anwendung auf Compute Engine-VMs ausgeführt wird, müssen Sie wahrscheinlich Software installieren und die Instanzen konfigurieren, um Ihre Anwendung auszuführen. Obwohl Sie neue Instanzen mit Startskripts konfigurieren können, ist es effizienter, ein benutzerdefiniertes Image zu erstellen. Ein benutzerdefiniertes Image ist ein Bootlaufwerk, das Sie mit Ihrer anwendungsspezifischen Software und Konfiguration einrichten.

Weitere Informationen zum Verwalten von Images finden Sie im Artikel Best Practices für die Image-Verwaltung.

Beim Erstellen des Images können Sie eine Instanzvorlage definieren. Instanzvorlagen kombinieren das Bootlaufwerk-Image, den Maschinentyp und andere Instanzeigenschaften. Sie können dann eine Instanzvorlage verwenden, um einzelne VM-Instanzen oder eine verwaltete Instanzgruppe zu erstellen. Instanzvorlagen sind eine praktische Möglichkeit, die Konfiguration einer VM-Instanz zu speichern, damit Sie später identische neue VM-Instanzen erstellen können.

Das Erstellen benutzerdefinierter Images und Instanzvorlagen kann zwar die Bereitstellungsgeschwindigkeit erhöhen, aber auch die Wartungskosten erhöhen, da die Images möglicherweise häufiger aktualisiert werden müssen. Weitere Informationen finden Sie in der Dokumentation Image-Konfiguration und Bereitstellungsgeschwindigkeit ausgleichen.

Anwendung containerisieren

Eine Alternative zum Erstellen von benutzerdefinierten VM-Instanzen ist die Containerisierung Ihrer Anwendung. Ein Container ist ein einfaches, eigenständiges, ausführbares Softwarepaket, das alles enthält, was zum Ausführen einer Anwendung erforderlich ist: Code, Laufzeit, Systemtools, Systembibliotheken und Einstellungen. Diese Eigenschaften machen Containeranwendungen portabler, einfacher bereitzustellen und einfacher zu verwalten als virtuelle Maschinen. Außerdem lassen sich Container in der Regel schnell starten, damit sie für skalierbare und robuste Anwendungen geeignet sind.

Google Cloud bietet mehrere Dienste zum Ausführen Ihrer Anwendungscontainer. Cloud Run bietet eine serverlose, verwaltete Computing-Plattform zum Hosten Ihrer zustandslosen Container. Die flexible App Engine-Umgebung hostet Ihre Container in einer verwalteten PaaS-Lösung (Platform as a Service). GKE bietet eine verwaltete Kubernetes-Umgebung zum Hosten und Orchestrieren Ihrer containerisierten Anwendungen. Sie können Ihre Anwendungscontainer auch in Compute Engine ausführen, wenn Sie die vollständige Kontrolle über Ihre Containerumgebung benötigen.

Anwendung für einen schnellen Start optimieren

Sie müssen nicht nur dafür sorgen, dass Ihre Infrastruktur und Anwendung so effizient wie möglich bereitgestellt werden, sondern auch, dass Ihre Anwendung schnell online geht.

Welche Optimierungen für Ihre Anwendung geeignet sind, hängt von den Eigenschaften der Anwendung und der Ausführungsplattform ab. Folgendes ist wichtig:

  • Suchen und beheben Sie Engpässe, indem Sie die kritischen Bereiche Ihrer Anwendung, die beim Start aufgerufen werden, ermitteln.
  • Reduzieren Sie die anfängliche Startzeit, indem Sie Techniken wie die verzögerte Initialisierung implementieren, insbesondere bei teuren Ressourcen.
  • Minimieren Sie Anwendungsabhängigkeiten, die möglicherweise beim Start geladen werden müssen.

Modulare Architekturen bevorzugen

Sie können die Flexibilität Ihrer Anwendung erhöhen, indem Sie Architekturen auswählen, mit denen Komponenten unabhängig bereitgestellt, verwaltet und skaliert werden können. Dieses Muster kann auch die Ausfallsicherheit verbessern, indem Single Points of Failure beseitigt werden.

Anwendung in unabhängige Dienste unterteilen

Wenn Sie Ihre Anwendung als eine Reihe von locker gekoppelten, unabhängigen Diensten entwerfen, können Sie die Flexibilität Ihrer Anwendung erhöhen. Wenn Sie ein locker gekoppeltes Design verwenden, können Ihre Dienste unabhängig freigegeben und bereitgestellt werden. Neben vielen weiteren Vorteilen ermöglicht dieser Ansatz, dass diese Dienste verschiedene Technologiestacks verwenden und von verschiedenen Teams verwaltet werden. Dieser locker gekoppelte Ansatz ist das Hauptthema von Architekturmustern wie Mikrodiensten und SOA.

Wenn Sie überlegen, wie Sie Grenzen um Ihre Dienste ziehen, sind die Anforderungen an Verfügbarkeit und Skalierbarkeit wichtige Dimensionen. Wenn eine bestimmte Komponente beispielsweise eine andere Verfügbarkeitsanforderung oder ein anderes Skalierungsprofil als Ihre anderen Komponenten hat, kann sie für einen eigenständigen Dienst geeignet sein.

Weitere Informationen finden Sie unter Monolithische Anwendung zu Mikrodiensten migrieren.

Nach Zustandslosigkeit streben

Eine zustandslose Anwendung oder ein zustandsloser Dienst speichert keine lokalen nichtflüchtigen Daten oder keinen lokalen nichtflüchtigen Status. Ein zustandsloses Modell stellt sicher, dass Sie jede Anfrage oder Interaktion mit dem Dienst unabhängig von vorherigen Anfragen verarbeiten können. Dieses Modell erleichtert die Skalierbarkeit und Wiederherstellbarkeit, da der Dienst erweitert, verkleinert oder neu gestartet werden kann, ohne Daten zu verlieren, die für die Verarbeitung von In-Flight-Prozessen oder -Anfragen erforderlich sind. Zustandslosigkeit ist besonders wichtig, wenn Sie ein Autoscaling verwenden, da die Instanzen, Knoten oder Pods, die den Dienst hosten, unerwartet erstellt und gelöscht werden können.

Möglicherweise sind nicht alle Dienste zustandslos. Geben Sie in diesem Fall explizit Dienste an, die einen Status erfordern. Durch eine klare Trennung von zustandslosen und zustandsorientierten Diensten können Sie eine einfache Skalierbarkeit für zustandslose Dienste gewährleisten und gleichzeitig einen überlegteren Ansatz für zustandsorientierte Dienste auswählen.

Kommunikation zwischen Diensten verwalten

Eine Herausforderung bei verteilten Mikrodienstarchitekturen ist die Verwaltung der Kommunikation zwischen Diensten. Wenn Ihr Netzwerk von Diensten wächst, werden wahrscheinlich auch die Abhängigkeiten von Diensten zunehmen. Sie möchten nicht, dass der Ausfall eines Dienstes zum Ausfall anderer Dienste führt, was manchmal als kaskadierender Fehler bezeichnet wird.

Sie können dazu beitragen, den Traffic zu einem überlasteten oder fehlgeschlagenen Dienst zu reduzieren, indem Sie Verfahren wie das Schutzschaltermuster, exponentielle Backoffs und ordnungsgemäße Beeinträchtigungen anwenden. Diese Muster erhöhen die Ausfallsicherheit Ihrer Anwendung, da überlastete Dienste wiederhergestellt werden können oder Fehlerstatus ordnungsgemäß verarbeitet werden. Weitere Informationen finden Sie im Kapitel Kaskadierende Fehler beheben im Google SRE-Buch.

Mit einem Service Mesh können Sie den Traffic in Ihren verteilten Diensten verwalten. Ein Service Mesh ist eine Software, die Dienste miteinander verknüpft und dabei hilft, Geschäftslogik vom Netzwerk zu entkoppeln. Ein Service Mesh bietet in der Regel Ausfallsicherheitsfunktionen wie Anfragewiederholungen, Failover und Unterbrechungen.

Geeignete Datenbank- und Speichertechnologien verwenden

Bestimmte Datenbanken und Speichertypen sind schwierig zu skalieren und stabil zu machen. Achten Sie darauf, dass Ihre Datenbankauswahl nicht die Verfügbarkeit und Skalierbarkeit Ihrer Anwendung einschränkt.

Datenbankanforderungen bewerten

Das Muster, mit dem Sie Ihre Anwendung als Satz unabhängiger Dienste gestalten, gilt auch für Ihre Datenbanken und Ihren Speicher. Es kann sinnvoll sein, für verschiedene Teile Ihrer Anwendung verschiedene Speichertypen auszuwählen, was zu einem gemischten Speicher führt.

Traditionelle Anwendungen arbeiten oft nur mit relationalen Datenbanken. Relationale Datenbanken bieten nützliche Funktionen wie Transaktionen, strikte Konsistenz, referenzielle Integrität und ausgefeilte Abfragen über Tabellen hinweg. Diese Funktionen machen relationale Datenbanken zu einer guten Wahl für viele gängige Anwendungsfunktionen. Relationale Datenbanken haben jedoch auch einige Einschränkungen. Sie sind normalerweise schwer skalierbar und erfordern eine sorgfältige Verwaltung in einer Hochverfügbarkeitskonfiguration. Eine relationale Datenbank ist möglicherweise nicht die beste Wahl für alle Ihre Datenbankanforderungen.

Nicht relationale Datenbanken, die oft als NoSQL-Datenbanken bezeichnet werden, verfolgen einen anderen Ansatz. Obwohl die Details je nach Produkt variieren, verzichten NoSQL-Datenbanken in der Regel auf einige Funktionen relationaler Datenbanken zugunsten einer höheren Verfügbarkeit und einfacheren Skalierbarkeit. In Bezug auf das CAP-Theorem wählen NoSQL-Datenbanken häufig Verfügbarkeit statt Konsistenz aus.

Ob eine NoSQL-Datenbank geeignet ist, hängt oft von der erforderlichen Konsistenz ab. Wenn Ihr Datenmodell für einen bestimmten Dienst nicht alle Funktionen eines RDBMS erfordert und letztendlich konsistent sein kann, bietet die Auswahl einer NoSQL-Datenbank möglicherweise eine höhere Verfügbarkeit und Skalierbarkeit.

Neben einer Reihe relationaler und NoSQL-Datenbanken bietet Google Cloud auch Cloud Spanner, eine stark konsistente, hochverfügbare und global verteilte Datenbank mit Unterstützung für SQL. Informationen zum Auswählen einer geeigneten Datenbank in Google Cloud finden Sie unter Google Cloud-Datenbanken.

Caching einbinden

Der Hauptzweck eines Caches besteht darin, die Leistung beim Datenabruf zu erhöhen, indem weniger auf die zugrunde liegende langsamere Speicherebene zugegriffen werden muss.

Caching unterstützt eine verbesserte Skalierbarkeit, da die Abhängigkeit von festplattenbasiertem Speicher verringert wird. Da Anfragen aus dem Speicher verarbeitet werden können, sind die Anfragelatenzen für die Speicherebene geringer, damit Ihr Dienst in der Regel mehr Anfragen verarbeiten kann. Darüber hinaus kann das Caching die Belastung von Diensten reduzieren, die Ihrer Anwendung nachgeschaltet sind, insbesondere von Datenbanken, damit andere Komponenten, die mit diesem nachgelagerten Dienst interagieren, einfacher oder überhaupt skaliert werden können.

Caching kann auch die Ausfallsicherheit erhöhen, indem es Techniken wie ordnungsgemäße Alterung unterstützt. Wenn die zugrunde liegende Speicherebene überlastet oder nicht verfügbar ist, kann der Cache weiterhin Anfragen verarbeiten. Auch wenn die aus dem Cache zurückgegebenen Daten unvollständig oder nicht aktuell sind, kann dies für bestimmte Szenarien akzeptabel sein.

Memorystore for Redis bietet einen vollständig verwalteten Dienst, der vom Redis In-Memory-Datenspeicher bereitgestellt wird. Memorystore for Redis bietet einen Zugriff mit niedriger Latenz und einen hohen Durchsatz für Daten, auf die häufig zugegriffen wird. Es kann in einer Hochverfügbarkeitskonfiguration bereitgestellt werden, die zonenübergreifende Replikation und automatisches Failover bietet.

Entwicklungsprozesse und Unternehmenskultur modernisieren

DevOps kann als eine breite Sammlung von Prozessen, Unternehmenskulturen und Tools betrachtet werden, die die Flexibilität und die verkürzte Produkteinführungszeit von Anwendungen und Funktionen fördern, indem sie Silos zwischen Entwicklung, Betrieb und verwandten Teams aufteilen. DevOps-Techniken sollen die Qualität und Zuverlässigkeit von Software verbessern.

Eine ausführliche Beschreibung von DevOps wird in diesem Artikel nicht behandelt. Einige wichtige Aspekte, die sich auf die Verbesserung der Zuverlässigkeit und Ausfallsicherheit Ihrer Anwendung beziehen, werden in den folgenden Abschnitten erläutert. Weitere Informationen finden Sie auf der Google Cloud-DevOps-Seite.

Bei der Entwicklung für Testbarkeit sorgen

Automatisierte Tests sind ein wichtiger Bestandteil moderner Softwarebereitstellungspraktiken. Die Möglichkeit, umfassende Einheiten-, Integrations- und Systemtests durchzuführen, ist wichtig, um sicherzustellen, dass sich Ihre Anwendung wie erwartet verhält und in der nächsten Phase des Bereitstellungszyklus fortschreitet. Testbarkeit ist ein wichtiges Designkriterium für Ihre Anwendung.

Wir empfehlen, Einheitentests für den Großteil Ihrer Tests zu verwenden, da sie schnell ausgeführt und in der Regel einfach zu warten sind. Außerdem empfehlen wir Ihnen, die übergeordnete Integration und Systemtests zu automatisieren. Diese Tests werden erheblich vereinfacht, wenn Sie Infrastructure-as-Code-Techniken anwenden, da dedizierte Testumgebungen und -ressourcen bei Bedarf erstellt und nach Abschluss der Tests deaktiviert werden können.

Wenn der Prozentsatz der von Tests abgedeckten Codebasis zunimmt, verringern Sie die Unsicherheit und die potenzielle Abnahme der Zuverlässigkeit durch jede Codeänderung. Eine angemessene Testabdeckung bedeutet, dass Sie weitere Änderungen vornehmen können, bevor die Zuverlässigkeit unter ein akzeptables Niveau fällt.

Automatisierte Tests sind ein integraler Bestandteil der kontinuierlichen Integration. Die Ausführung einer robusten Reihe automatisierter Tests für jeden Code-Commit liefert schnelles Feedback zu Änderungen und verbessert die Qualität und Zuverlässigkeit Ihrer Software. Google Cloud-native Tools wie Cloud Build und Tools von Drittanbietern wie Jenkins können Ihnen bei der Implementierung der kontinuierlichen Integration helfen.

Bereitstellungen automatisieren

Durch kontinuierliche Integration und umfassende Testautomatisierung können Sie sich auf die Stabilität Ihrer Software verlassen. Wenn sie eingerichtet sind, müssen Sie als Nächstes die Bereitstellung Ihrer Anwendung automatisieren. Der Grad der Automatisierung der Bereitstellung hängt von der Reife Ihrer Organisation ab.

Die Auswahl einer geeigneten Bereitstellungsstrategie ist wichtig, um die Risiken der Bereitstellung neuer Software zu minimieren. Mit der richtigen Strategie können Sie die Präsenz neuer Versionen für größere Zielgruppen schrittweise erhöhen und dabei das Verhalten prüfen. Sie können auch eindeutige Bestimmungen für Rollbacks festlegen, wenn Probleme auftreten.

Beispiele für die Automatisierung von Bereitstellungen finden Sie unter Continuous Delivery-Pipelines mit Spinnaker und GKE und Canary-Analyse in GKE mit Spinnaker automatisieren.

SRE-Methoden für den Umgang mit Fehlern übernehmen

Bei verteilten Anwendungen, die im großen Maßstab ausgeführt werden, ist ein Fehler in einer oder mehreren Komponenten üblich. Wenn Sie die in diesem Dokument beschriebenen Muster übernehmen, kann Ihre Anwendung Unterbrechungen aufgrund eines fehlerhaften Software-Releases, einer unerwarteten Beendigung virtueller Maschinen oder sogar eines Infrastrukturausfalls, der eine ganze Zone betrifft, besser bewältigen.

Doch selbst bei sorgfältig durchdachtem Anwendungsdesign kommt es zwangsläufig zu unerwarteten Ereignissen, die eine manuelle Interaktion erfordern. Wenn Sie strukturierte Prozesse zur Verwaltung dieser Ereignisse einrichten, können Sie deren Auswirkungen erheblich reduzieren und sie schneller beheben. Wenn Sie außerdem die Ursachen und Antworten auf das Ereignis untersuchen, können Sie Ihre Anwendung in Zukunft vor ähnlichen Ereignissen schützen.

Leistungsstarke Prozesse für die Verwaltung von Vorfällen und das Ausführen von fehlerfreien Postmortems sind die wichtigsten Grundsätze von SRE. Auch wenn die Implementierung der vollständigen Google SRE-Methoden für Ihre Organisation nicht praktikabel ist, können Sie die Ausfallsicherheit Ihrer Anwendung verbessern, wenn Sie nur einen minimalen Satz von Richtlinien übernehmen. Die Anhänge im SRE-Buch enthalten einige Vorlagen, die Sie bei der Gestaltung Ihrer Prozesse unterstützen können.

Architektur validieren und prüfen

Wenn sich Ihre Anwendung weiterentwickelt, können sich das Nutzerverhalten, die Zugriffsprofile und sogar die geschäftlichen Prioritäten ändern. Ebenso können sich andere Dienste oder Infrastrukturen entwickeln, von denen Ihre Anwendung abhängt. Daher ist es wichtig, die Ausfallsicherheit und Skalierbarkeit Ihrer Anwendung regelmäßig zu testen und zu validieren.

Belastbarkeit testen

Es ist wichtig, zu testen, ob Ihre Anwendung auf Ausfälle wie erwartet reagiert. Das übergeordnete Thema ist, dass Fehler am besten vermieden werden können, indem Fehler eingeführt werden und daraus gelernt wird.

Das Simulieren und Einleiten von Fehlern ist komplex. Sie müssen nicht nur das Verhalten Ihrer Anwendung oder Ihres Dienstes prüfen, sondern auch dafür sorgen, dass die erwarteten Benachrichtigungen generiert und die entsprechenden Messwerte generiert werden. Wir empfehlen einen strukturierten Ansatz, bei dem Sie einfache Fehler einleiten und dann eskalieren.

Sie können beispielsweise wie hier beschrieben vorgehen und das Verhalten in jeder Phase validieren und dokumentieren:

  • Leiten Sie vorübergehende Fehler ein.
  • Blockieren Sie den Zugriff auf Abhängigkeiten des Dienstes.
  • Blockieren Sie die gesamte Netzwerkkommunikation.
  • Beenden Sie Hosts.

Weitere Informationen finden Sie im Video Aufbrechen Ihrer Systeme, um sie unzerbrechlich zu machen von Google Cloud Next 2019.

Wenn Sie ein Service Mesh wie Istio verwenden, um Ihre Anwendungsdienste zu verwalten, können Sie Fehler auf der Anwendungsebene einfügen, anstatt Pods oder Maschinen zu beenden, oder beschädigte Pakete auf der TCP-Ebene einfügen. Sie können Verzögerungen einleiten, um die Netzwerklatenz oder ein überlastetes Upstream-System zu simulieren. Sie können auch Abbrüche einführen, die Fehler in vorgelagerten Systemen nachahmen.

Skalierungsverhalten testen

Wir empfehlen Ihnen, automatisierte, nicht funktionierende Tests zu verwenden, um zu prüfen, ob Ihre Anwendung wie erwartet skaliert wird. Häufig ist diese Prüfung mit Leistungs- oder Lasttests verbunden. Sie können einfache Tools wie hey verwenden, um die Last an eine Webanwendung zu senden. Ein ausführlicheres Beispiel für Lasttests mit einem REST-Endpunkt finden Sie unter Verteilte Lasttests mit Google Kubernetes Engine.

Ein häufiger Ansatz besteht darin, sicherzustellen, dass wichtige Messwerte bei unterschiedlichen Lasten innerhalb der erwarteten Werte bleiben. Wenn Sie beispielsweise die Skalierbarkeit Ihrer Webstufe testen, können Sie die durchschnittlichen Anfragelatenzen für Volumen mit Leistungsspitzen von Nutzeranfragen messen. Ebenso können Sie für eine Back-End-Verarbeitungsfunktion die durchschnittliche Zeit für die Aufgabenverarbeitung messen, wenn das Aufgabenvolumen plötzlich ansteigt.

Außerdem sollten Sie mit Ihren Tests messen, dass die Anzahl der für die Testlast erstellten Ressourcen im erwarteten Bereich liegt. Ihre Tests können beispielsweise prüfen, ob die Anzahl der VMs, die für einige Back-End-Aufgaben erstellt wurden, einen bestimmten Wert nicht überschreitet.

Außerdem ist es wichtig, Grenzfälle zu testen. Wie verhält sich Ihre Anwendung oder Ihr Dienst, wenn die maximalen Skalierungslimits erreicht sind? Wie verhält es sich, wenn der Dienst herunterskaliert und dann die Last plötzlich wieder zunimmt? Eine Beschreibung dieser Themen finden Sie im Abschnitt zu Lasttests unter Produktionsbereitschaft während der Hauptsaison.

Immer an der Architektur arbeiten

Die Technologiewelt ist schnelllebig. Dies gilt insbesondere für die Cloud. Neue Produkte und Funktionen werden häufig veröffentlicht, neue Muster entstehen und die Anforderungen von Nutzern und internen Beteiligten steigen weiter.

Wie im Blogpost Prinzipien für cloudnative Architektur definiert, sollten Sie immer nach Möglichkeiten zum Optimieren, Vereinfachen und Verbessern der Architektur Ihrer Anwendungen suchen. Softwaresysteme sind lebende Dinge und müssen an Ihre sich ändernden Prioritäten angepasst werden.

Weitere Informationen