Bearbeiten

Muster „Computeressourcenkonsolidierung“

Azure App Service
Azure Kubernetes Service (AKS)

Konsolidieren Sie mehrere Tasks oder Vorgänge in einer einzelnen Compute-Einheit. Dies kann die Auslastung der Computerressourcen erhöhen und die Kosten sowie den Verwaltungsaufwand bei der Computeverarbeitung in Anwendungen senken, die in der Cloud gehostet werden.

Kontext und Problem

Eine Cloudanwendung implementiert häufig eine Vielzahl von Vorgängen. Bei einigen Lösungen ist es sinnvoll, zunächst dem Entwurfsprinzip der Trennung von Zuständigkeiten zu folgen und diese Vorgänge in separate Compute-Einheiten aufzuteilen, die einzeln gehostet und bereitgestellt werden (z. B. als separate App Service-Web-Apps oder als separate VMs). Doch obwohl diese Strategie dazu beitragen kann, das logische Design der Lösung zu vereinfachen, kann die Bereitstellung einer großen Anzahl von Compute-Einheiten im Rahmen derselben Anwendung die Kosten für das Laufzeithosting erhöhen und zu einer komplexeren Systemverwaltung führen.

Die Abbildung zeigt beispielhaft die vereinfachte Struktur einer cloudbasierten Lösung, die mit mehr als einer Compute-Einheit implementiert ist. Jede Compute-Einheit wird in einer eigenen virtuellen Umgebung ausgeführt. Jede Funktion wurde als separater Task implementiert (Task A bis Task E), der in einer eigenen Compute-Einheit ausgeführt wird.

Ausführen von Tasks in einer Cloudumgebung mit einer Gruppe dedizierter Compute-Einheiten

Jede Compute-Einheit verbraucht kostenpflichtige Ressourcen, auch wenn sie sich im Leerlauf befindet oder nur selten genutzt wird. Daher ist dies nicht immer die kosteneffizienteste Lösung.

In Azure gilt dies für App Services, Container Apps und Virtual Machines. Diese Elemente werden in einer eigenen Umgebung ausgeführt. Das Ausführen einer Sammlung separater Websites, Microservices oder VMs, die zur Ausführung einer Reihe klar definierter Vorgänge konzipiert sind, aber als Teil einer einzigen Lösung kommunizieren und zusammenarbeiten müssen, kann dies zu einer ineffizienten Ressourcennutzung führen.

Lösung

Um Kosten zu senken, die Auslastung zu erhöhen, die Kommunikationsgeschwindigkeit zu verbessern und den Verwaltungsaufwand zu senken, können mehrere Tasks oder Vorgänge in einer einzigen Compute-Einheit konsolidiert werden.

Tasks können nach Kriterien gruppiert werden, die auf den von der Umgebung bereitgestellten Features sowie den damit verbundenen Kosten basieren. Ein gängiger Ansatz besteht darin, nach Tasks zu suchen, die ein ähnliches Profil hinsichtlich ihrer Skalierbarkeit, Lebensdauer und Verarbeitungsanforderungen aufweisen. Das Gruppieren dieser Tasks ermöglicht es, sie als eine Einheit zu skalieren. Die Elastizität vieler Cloudumgebungen ermöglicht es, je nach Workload zusätzliche Instanzen einer Compute-Einheit zu starten und zu beenden. Beispielsweise bietet Azure eine automatische Skalierung, die Sie auf App Services und Virtual Machine Scale Sets anwenden können. Weitere Informationen finden Sie im Leitfaden für die automatische Skalierung.

Betrachten Sie als Gegenbeispiel die folgenden zwei Tasks. Sie veranschaulichen die Verwendung der Skalierbarkeit, um zu bestimmen, welche Vorgänge nicht gruppiert werden sollten:

  • Task 1 ruft seltene, zeitunempfindlichen Nachrichten ab, die an eine Warteschlange gesendet werden.
  • Task 2 verarbeitet Spitzen im Netzwerkdatenverkehr.

Der zweite Task erfordert Elastizität, die das Starten und Beenden einer großen Anzahl von Instanzen der Compute-Einheit beinhalten kann. Die Anwendung derselben Skalierung auf den ersten Task würde lediglich dazu führen, dass mehr Tasks auf seltene Nachrichten in derselben Warteschlange lauschen. Dies wäre eine Vergeudung von Ressourcen.

In vielen Cloudumgebungen ist es möglich, die einer Compute-Einheit zur Verfügung stehenden Ressourcen in Bezug auf die Anzahl von CPU-Kernen, den Arbeitsspeicher, den Festplattenspeicher usw. anzugeben. Allgemein gilt: Je mehr Ressourcen angegeben werden, desto höher sind die Kosten. Um Kosteneinsparungen zu erzielen, muss eine teure Compute-Einheit maximal ausgelastet werden und darf nicht für längere Zeit inaktiv sein.

Wenn Tasks vorhanden sind, die für kurze Spitzen viel CPU-Leistung anfordern, sollten diese in einer einzigen Compute-Einheit zusammengefasst werden, die die benötigte Leistung bereitstellt. Es ist hierbei jedoch wichtig, die Anforderung zur maximalen Auslastung teurer Ressourcen gegen die Konflikte abzuwägen, die bei einer Überlastung der Ressourcen auftreten können. Rechenintensive Tasks mit langer Ausführungszeit sollten beispielsweise nicht dieselbe Compute-Einheit verwenden.

Probleme und Überlegungen

Beachten Sie bei der Implementierung dieses Musters die folgenden Punkte:

Skalierbarkeit und Elastizität. Viele Cloudlösungen implementieren Skalierbarkeit und Elastizität auf Ebene der Compute-Einheit, indem sie Instanzen von Compute-Einheiten starten und beenden. Vermeiden Sie es, Tasks mit konfliktverursachenden Skalierbarkeitsanforderungen in derselben Compute-Einheit zu gruppieren.

Lebensdauer. Die Cloudinfrastruktur recycelt in regelmäßigen Abständen die virtuelle Umgebung, die eine Compute-Einheit hostet. Wenn in einer Compute-Einheit zu viele Tasks mit langer Ausführungszeit enthalten sind, muss die Einheit möglicherweise so konfiguriert werden, dass sie nicht vor dem Abschluss dieser Tasks recycelt wird. Alternativ können Sie die Tasks mit einem Prüfpunktansatz entwerfen. Hierdurch können die Tasks sauber beendet und an dem Punkt fortgesetzt werden, an dem sie beim Neustart der Compute-Einheit unterbrochen wurden.

Releaserhythmus. Wenn sich die Implementierung oder Konfiguration eines Tasks häufig ändert, muss die Compute-Einheit, die den aktualisierten Code hostet, möglicherweise beendet, neu konfiguriert, neu bereitgestellt und dann neu gestartet werden. Dies erfordert auch, dass alle anderen Tasks innerhalb derselben Compute-Einheit beendet, neu bereitgestellt und neu gestartet werden.

Sicherheit. Tasks in derselben Compute-Einheit können sich einen Sicherheitskontext teilen und auf dieselben Ressourcen zugreifen. Es muss ein hohes Maß an Vertrauen zwischen den Tasks bestehen, und es muss sichergestellt sein, dass die Tasks sich nicht gegenseitig beschädigen oder beeinträchtigen. Zusätzlich wird durch eine Erhöhung der Anzahl von Tasks, die in einer Compute-Einheit ausgeführt werden, die Angriffsfläche der Einheit vergrößert. Jeder Task ist nur so sicher wie derjenige mit dem höchsten Sicherheitsrisiko.

Fehlertoleranz. Wenn ein Task in einer Compute-Einheit zu einem Fehler führt oder der Task sich ungewöhnlich verhält, kann dies Auswirkungen auf die anderen Tasks haben, die innerhalb derselben Einheit ausgeführt werden. Wenn z.B. ein Task nicht ordnungsgemäß gestartet wird, kann dies zu einem Fehler für die gesamte Startlogik der Compute-Einheit führen, sodass andere Tasks in derselben Einheit nicht ausgeführt werden können.

Konflikte. Vermeiden Sie Konflikte zwischen Tasks, die um Ressourcen in derselben Compute-Einheit konkurrieren. Im Idealfall sollten Tasks, die dieselbe Compute-Einheit verwenden, unterschiedliche Merkmale in Bezug auf die Ressourcennutzung aufweisen. Beispielsweise sollten zwei rechenintensive Tasks nicht in derselben Compute-Einheit platziert werden, und ebenso auch keine zwei Tasks, die viel Speicher verbrauchen. Die Zusammenlegung eines rechenintensiven Tasks mit einem Task, der viel Arbeitsspeicher benötigt, ist hingegen eine geeignete Kombination.

Hinweis

Ziehen Sie in Betracht, die Computeressourcen nur für ein System zu konsolidieren, das seit einiger Zeit in Produktion ist, sodass Operatoren und Entwickler das System überwachen und ein Wärmebild erstellen können, das die Verwendung der verschiedenen Ressourcen durch jeden Task zeigt. Anhand dieses Wärmebilds kann festgestellt werden, welche Tasks gute Kandidaten für die gemeinsame Nutzung von Computeressourcen sind.

Komplexität. Die Kombination mehrerer Tasks in einer einzigen Compute-Einheit erhöht die Komplexität des Codes in der Einheit und erschwert möglicherweise das Testen, Debuggen sowie die Wartung.

Stabile logische Architektur. Entwickeln und implementieren Sie den Code in jedem Task so, dass er selbst dann nicht geändert werden muss, wenn sich die physische Umgebung für die Taskausführung ändert.

Weitere Strategien. Die Konsolidierung von Computeressourcen ist nur eine Möglichkeit, die Kosten zu senken, die mit der gleichzeitigen Ausführung mehrerer Tasks verbunden sind. Es ist eine sorgfältige Planung und Überwachung erforderlich, um sicherzustellen, dass die Konsolidierung ein wirksamer Ansatz bleibt. Andere Strategien sind möglicherweise besser geeignet – je nach Art der Arbeit und abhängig davon, wo sich die Benutzer befinden, die diese Aufgaben ausführen. Zum Beispiel kann die funktionale Zerlegung der Workload (wie beschrieben im Leitfaden zur Computepartitionierung) eine bessere Option darstellen.

Verwendung dieses Musters

Verwenden Sie dieses Muster für Tasks, die nicht kosteneffizient sind, wenn sie in eigenen Compute-Einheiten ausgeführt werden. Wenn ein Task viel Zeit im Leerlauf verbringt, kann es teuer sein, diesen Task in einer dedizierten Einheit auszuführen.

Dieses Muster eignet sich möglicherweise nicht für Tasks, die kritische fehlertolerante Vorgänge ausführen, oder für Tasks, die hochsensible oder private Daten verarbeiten und einen eigenen Sicherheitskontext benötigen. Diese Tasks sollten in einer eigenen, isolierten Umgebung in einer separaten Compute-Einheit ausgeführt werden.

Workloadentwurf

Ein Architekt sollte evaluieren, wie das Muster für die Konsolidierung von Compute-Ressourcen im Design seiner Workloads verwendet werden kann, um die Ziele und Prinzipien zu erreichen, die in den Säulen des Azure Well-Architected Framework behandelt werden. Zum Beispiel:

Säule So unterstützt dieses Muster die Säulenziele
Die Kostenoptimierung konzentriert sich auf Erhaltung und Verbesserung der Rendite Ihrer Workload. Dieses Muster maximiert die Nutzung von Rechenressourcen, indem ungenutzte bereitgestellte Kapazität durch die Aggregation von Komponenten oder sogar ganzen Workloads in einer gepoolten Infrastruktur vermieden wird.

- CO:14 Konsolidierung
Operational Excellence unterstützt die Workloadqualität durch standardisierte Prozesse und Teamzusammenhalt. Die Konsolidierung kann zu einer homogeneren Rechenplattform führen, die die Verwaltung und den Einblick vereinfacht und unterschiedliche Ansätze für betriebliche Aufgaben sowie den Umfang der erforderlichen Tools reduziert.

- OE:07 Überwachungssystem
- OE:10 Automatisierungsdesign
Die Leistungseffizienz hilft Ihrer Workload, Anforderungen effizient durch Optimierungen in Skalierung, Daten und Code zu erfüllen. Durch die Konsolidierung wird die Nutzung von Rechenressourcen maximiert, indem freie Knotenkapazität genutzt und die Notwendigkeit einer Überbereitstellung verringert wird. Große (vertikal skalierte) Recheninstanzen werden häufig im Ressourcenpool für diese Infrastrukturen verwendet.

- PE:02 Kapazitätsplanung
- PE:03 Dienste auswählen

Berücksichtigen Sie wie bei jeder Designentscheidung alle Kompromisse im Hinblick auf die Ziele der anderen Säulen, die mit diesem Muster eingeführt werden könnten.

Auswahlmöglichkeiten für die Anwendungsplattform

Dieses Muster kann je nach verwendetem Computedienst auf unterschiedliche Weise erreicht. Sehen Sie sich die folgenden Beispieldienste an:

  • Azure App Service und Azure Functions: Stellen Sie freigegebene App Service-Pläne bereit, die die Hostserverinfrastruktur darstellen. Es können eine oder mehrere Apps für die Ausführung auf denselben Computeressourcen (oder in demselben App Service-Plan) konfiguriert werden.
  • Azure Container Apps: Stellen Sie Container-Apps in denselben freigegebenen Umgebungen insbesondere in Situationen, in denen Sie verwandte Dienste verwalten oder verschiedene Anwendungen im selben virtuellen Netzwerk bereitstellen müssen.
  • Azure Kubernetes Service (AKS): AKS ist eine containerbasierte Hostinginfrastruktur, in der mehrere Anwendungen oder Anwendungskomponenten so konfiguriert werden können, dass sie gemeinsam auf denselben Computingressourcen (Knoten) ausgeführt werden, gruppiert nach Rechenanforderungen wie CPU- oder Arbeitsspeicheranforderungen (Knotenpools).
  • Virtuelle Maschinen: Stellen Sie eine einzelne Gruppe von Virtuelle Maschinen bereit, die von allen Mandanten verwendet werden sollen, sodass die Verwaltungskosten auf die Mandanten verteilt werden. Virtual Machine Scale Sets ist ein Feature, das die gemeinsame Ressourcenverwaltung, den Lastenausgleich und die horizontale Skalierung von Virtual Machines unterstützt.

Die folgenden Muster und Anweisungen können für die Implementierung dieses Musters ebenfalls relevant sein:

  • Leitfaden für die automatische Skalierung. Die automatische Skalierung kann verwendet werden, um Dienstinstanzen zu starten und zu beenden, die Computeressourcen hosten – je nach erwartetem Verarbeitungsbedarf.

  • Richtlinien zur Computepartitionierung. Hier wird beschrieben, wie die Dienste und Komponenten in einem Clouddienst so zugewiesen werden, dass die Ausführungskosten minimiert und gleichzeitig die Skalierbarkeit, Leistung, Verfügbarkeit und Sicherheit des Diensts beibehalten werden.

  • Architekturansätze für Compute in mehrinstanzenfähigen Lösungen. Bietet Anleitungen zu den Überlegungen und Anforderungen, die für Lösungsarchitekten wichtig sind, wenn sie die Computedienste einer mehrinstanzenfähigen Lösung planen.