Ausrichtung des Entwurfs auf Aufskalierung
Entwerfen der Anwendung mit Blick auf die horizontale Skalierung
Einer der Hauptvorteile der Cloud ist die elastische Skalierbarkeit: Sie können so viel Kapazität nutzen, wie Sie benötigen. Wenn die Auslastung steigt, können Sie das System horizontal hochskalieren und es wieder herunterskalieren, wenn die zusätzliche Kapazität nicht mehr benötigt wird. Entwerfen Sie Ihre Anwendung so, dass sie durch Hinzufügen oder Entfernen von Instanzen horizontal skaliert werden kann, um das Angebot auf die Nachfrage abzustimmen.
Die Skalierbarkeit wird am Verhältnis der Durchsatzbeschleunigung zur Zunahme der Ressourcen gemessen. In einem gut konzipierten System sind beide Zahlen idealerweise proportional zueinander: eine doppelte Ressourcenzuweisung führt zu doppeltem Durchsatz. In der Regel wird die Skalierbarkeit durch die Einführung von Engpässen oder Synchronisierungspunkten in das System eingeschränkt.
Empfehlungen
Vermeiden Sie Instanzbindung. Bindung oder Sitzungsaffinität tritt auf, wenn Anforderungen desselben Clients immer an den gleichen Server weitergeleitet werden. Dies beeinträchtigt die Fähigkeit einer Anwendung, sich aufskalieren zu lassen. Beispielsweise wird der Datenverkehr eines Benutzers mit hohem Datenvolumen nicht auf mehrere Instanzen verteilt. Gründe für die Bindung können das Speichern des Sitzungszustands im Arbeitsspeicher und die Verwendung von bestimmten Schlüsseln für die Verschlüsselung sein. Stellen Sie sicher, dass jede Instanz jede Anforderung verarbeiten kann.
Identifizieren Sie Engpässe. Die horizontale Skalierung ist kein Wundermittel für jedes Leistungsproblem. Wenn beispielsweise Ihre Back-End-Datenbank der Engpass ist, hilft das Hinzufügen weiterer Webserver nicht. Identifizieren und beheben Sie zuerst die Engpässe im System, bevor Sie weitere Instanzen einrichten, um das Problem zu lösen. Zustandsbehaftete Teile des Systems sind die wahrscheinlichste Ursache von Engpässen.
Teilen Sie Workloads je nach Skalierbarkeitsanforderungen auf. Anwendungen bestehen häufig aus mehreren Workloads, die jeweils unterschiedliche Anforderungen an die Skalierung aufweisen. Eine Anwendung verfügt möglicherweise über eine öffentliche Site und eine separate Site für die Verwaltung. Auf der öffentlichen Site treten möglicherweise plötzliche Datenverkehrs-Lastspitzen auf, während die Verwaltungssite eine kleinere und besser vorhersehbare Last aufweist.
Entwerfen Sie autonome und entkoppelte Komponenten, die über asynchrone Kommunikationsprotokolle kommunizieren. Im Idealfall sollten Komponenten über einen eigenen, unabhängigen Status verfügen und Ereignisse verwenden, um jegliche Änderungen oder Aktivitäten an externe Komponenten zu übermitteln. Dies ermöglicht die unabhängige Skalierung lediglich der überladenen Komponente. Implementieren Sie Ablaufsteuerungsmechanismen zum Verwalten von Datenverkehr und zur ordnungsgemäßen Herabstufung. Die Verbraucher sollten ihre eigene Verbrauchsrate kontrollieren. Die Erzeuger sollten ihre eigene Übertragungsrate einschließlich des Anhaltens kontrollieren. Nachrichtenwarteschlangen sind gute Optionen, um zusätzliche Workloads zu absorbieren und es Verbrauchern zu ermöglichen, ihre Arbeit in ihrem eigenen Tempo zu erledigen.
Vermeiden Sie unnötige Kommunikation, Koordination und Wartezeit.
Lagern Sie von Natur aus asynchrone Aufgaben aus. Aufgaben wie das Senden von E-Mails, Aktionen, bei denen der Benutzer keine sofortige Antwort benötigt, und die Integration in andere Systeme eignen sich gut für die Verwendung asynchroner Messagingmuster.
Lagern Sie ressourcenintensive Tasks aus. Tasks, die große Mengen an CPU- oder E/A-Ressourcen benötigen, sollten nach Möglichkeit in Hintergrundaufträge verschoben werden. So wird die Last auf dem Front-End, das die Benutzeranforderungen verarbeitet, minimiert.
Automatische Skalierung basierend auf Live-Nutzungsmetriken und Verwenden integrierter Funktionen für die automatische Skalierung. Viele Azure-Computedienste bieten integrierte Unterstützung für die automatische Skalierung. Wenn eine Anwendung eine vorhersehbare, regelmäßige Workload aufweist, sollte das Aufskalieren gemäß einem Zeitplan erfolgen. Skalieren Sie das System z.B. während der Geschäftszeiten auf. Wenn die Workload nicht vorhersehbar ist, verwenden Sie Leistungsmetriken wie die CPU-Auslastung oder die Länge der Anforderungswarteschlange, um die automatische Skalierung auszulösen. Beobachten Sie Anwendungen und ihre Kommunikationen, um Engpässe zu identifizieren und genauere Entscheidungen abzuleiten. Informationen zu den bewährten Methoden finden Sie unter Automatische Skalierung.
Ziehen Sie für kritische Workloads eine aggressive automatische Skalierung in Betracht. Bei kritischen Workloads müssen Sie der Nachfrage immer einen Schritt voraus sein. Es ist besser, bei hoher Auslastung schnell neue Instanzen hinzuzufügen, um den zusätzlichen Datenverkehr zu bewältigen, und das System dann nach und nach wieder herunterzuskalieren.
Konzipieren Sie Ihr System so, dass es abskaliert werden kann. Denken Sie daran, dass es bei elastischer Skalierung Zeiträume geben wird, in denen die Anwendung abskaliert wird, indem Instanzen entfernt werden. Die Anwendung muss die Entfernung von Instanzen ordnungsgemäß verarbeiten können. Nachfolgenden finden Sie einige Möglichkeiten, die Anwendung für ein horizontales Herunterskalieren zu konfigurieren:
- Die Anwendung sollte auf „Herunterfahren“-Ereignisse lauschen (wenn verfügbar) und das Herunterfahren ordnungsgemäß ausführen.
- Clients/Consumer eines Diensts sollten die Behandlung vorübergehender Fehler und Wiederholungsversuche unterstützen.
- Erwägen Sie bei Tasks mit langer Ausführungsdauer die Aufteilung der Arbeit, indem Sie Prüfpunkte oder das Muster Pipes und Filter verwenden.
- Platzieren Sie Arbeitselemente in einer Warteschlange, sodass eine andere Instanz die Verarbeitung aufnehmen kann, wenn eine Instanz mitten in der Verarbeitung entfernt wird.
Erwägen Sie eine Skalierung zwecks Redundanz. Durch ein Aufskalieren kann die Zuverlässigkeit Ihrer Anwendung verbessert werden. Ziehen Sie zum Beispiel in Betracht, über mehrere Verfügbarkeitszonen aufzuskalieren, beispielsweise durch die Verwendung zonenredundanter Dienste. Dieser Ansatz kann den Durchsatz Ihrer Anwendung verbessern und bietet Ausfallsicherheit, wenn eine Zone ausfällt.
Modellieren und optimieren Sie die Skalierbarkeit Ihres Systems. Sie können zum Modellieren Ihres Systems einen Ansatz wie das Gesetz von Amdahl verwenden. Quantifizieren der Skalierbarkeit auf Basis von Parametern wie z. B. Konflikte und Kohärenz. „Konflikte“ bezieht sich auf wartezeitbedingte Verzögerungen bzw. das Platzieren in Warteschlangen für freigegebene Ressourcen. „Kohärenz“ bezieht sich auf die Zeit (Verzögerung), die benötigt wird, damit Daten aufeinander abgestimmt werden. Eine hohe Anzahl von Konflikten deutet auf eine sequenzielle Verarbeitung hin, die parallelisiert werden könnte. Eine hohe Kohärenz hingegen weist auf exzessive Abhängigkeiten zwischen den Prozessen hin, und Sie werden dazu aufgefordert, Interaktionen zu minimieren. Sie können während des Workloaddesigns die maximale effektive Kapazität Ihres Systems berechnen, um zu vermeiden, dass mehr Angebot als Nachfrage bereitgestellt wird, was zu Verschwendung führt.