Bearbeiten

Freigeben über


Muster „Prioritätswarteschlange“

Azure-Servicebus

Durch das Muster der Prioritätswarteschlange können Aufgaben mit hoher Priorität schneller von der Workload verarbeitet werden als Aufgaben mit niedrigerer Priorität. Bei diesem Muster werden Nachrichten genutzt, die an mindestens eine Warteschlange gesendet werden. Hilfreich ist das Muster bei Anwendungen, bei denen jeder Kunde individuelle Servicelevelgarantien erhält.

Kontext und Problem

Die Aufgaben, die Workloads verwalten und verarbeiten müssen, sind oft unterschiedlich wichtig und dringend. Manche Aufgaben müssen sofort bearbeitet werden, bei anderen besteht weniger Eile. Wenn Aufgaben mit hoher Priorität nicht rechtzeitig ausgeführt werden, wird u. U. die Benutzererfahrung beeinträchtigt und gegen die Vereinbarungen zum Servicelevel verstoßen.

Damit Workloads Aufgaben entsprechend ihrer Priorität effizient bearbeiten können, ist ein Mechanismus vonnöten, mit dem Aufgaben priorisiert und in Übereinstimmung mit diesen Prioritäten ausgeführt werden können. Normalerweise werden Aufgaben von Workloads in der Reihenfolge verarbeitet, in der sie eintreffen – unter Anwendung des Warteschlangen-Prinzips „First in, first out“ (FIFO). Bei dieser Vorgehensweise wird allerdings nicht berücksichtigt, wie wichtig die einzelnen Aufgaben sind.

Lösung

Bei Prioritätswarteschlangen werden die Aufgaben von den Workloads entsprechend ihrer Priorität verarbeitet, nicht gemäß der Reihenfolge, in der sie eintreffen. Eine Anwendung sendet der Warteschlange eine Nachricht, der von dieser Anwendung eine bestimmte Priorität zugeordnet wurde. Die Nachrichten werden von den Consumern dann entsprechend ihrer jeweiligen Priorität verarbeitet. Bei den folgenden Anforderungen sollten Sie das Muster der Prioritätswarteschlange einsetzen:

  • Sie verwalten Aufgaben, die unterschiedlich wichtig und dringend sind. Sie verwalten Aufgaben, die unterschiedlich wichtig und dringend sind, und Sie müssen gewährleisten, dass zunächst die wichtigeren Aufgaben ausgeführt werden und die weniger wichtigen erst anschließend.

  • Sie verwalten unterschiedliche Vereinbarungen zum Servicelevel. Sie bieten Ihren Kunden verschiedene Servicelevelgarantien an und müssen eine höhere Leistung und bessere Verfügbarkeit für Kunden mit hoher Priorität gewährleisten.

  • Sie müssen unterschiedliche Bedürfnisse hinsichtlich der Workload-Verwaltung erfüllen. Sie verwalten eine Workload, bei der bestimmte Aufgaben umgehend verarbeitet werden müssen, während andere Aufgaben nicht so dringend sind.

Um das Muster der Prioritätswarteschlange zu implementieren, gibt es zwei Möglichkeiten:

  • Eine Warteschlange: Alle Nachrichten werden an eine einzige Warteschlange gesendet. Dabei wird jeder einzelnen Nachricht eine Priorität zugeordnet.

  • Mehrere Warteschlangen: Für die einzelnen Prioritäten der Nachrichten werden verschiedene Warteschlangen genutzt.

Eine Warteschlange

Wird eine einzige Warteschlange verwendet, wird jeder einzelnen Nachricht von der Anwendung (Producer) eine Priorität zugeordnet und die Nachricht wird an die Warteschlange gesendet. Die Warteschlange ordnet die Nachrichten entsprechend ihrer Priorität an und gewährleistet damit, dass die Consumer zunächst die Nachrichten mit hoher Priorität verarbeiten und anschließend erst die Nachrichten, die eine geringere Priorität haben.

Diagramm eines Warteschlangenmechanismus mit Unterstützung für die Priorisierung von Nachrichten.
Abbildung 1. Architektur einer einzigen Warteschlange mit einem einzigen Consumer-Pool

Mehrere Warteschlangen

Mehrere Warteschlangen ermöglichen die Trennung der Nachrichten entsprechend ihrer Priorität. Dabei wird jeder Nachricht von der Anwendung eine Priorität zugeordnet. Basierend auf dieser Priorität wird die Anwendung dann in die entsprechende Warteschlange geleitet. Die Nachrichten werden von den Consumern verarbeitet. Bei einer Lösung mit mehreren Warteschlangen ist es möglich, einen einzigen Consumer-Pool oder mehrere Consumer-Pools zu nutzen.

Mehrere Consumer-Pools

Werden mehrere Consumer-Pools verwendet, sind jeder Warteschlange eigene Consumer-Ressourcen zugeordnet. Warteschlangen, die eine höhere Priorität besitzen, sollten mehr Consumer oder höhere Leistungsstufen nutzen, damit sie Nachrichten rascher verarbeiten können als Warteschlangen, die eine geringere Priorität haben.

In folgenden Fällen sollten Sie mehrere Consumer-Pools verwenden:

  • Strikte Anforderungen an die Leistung: Wenn die einzelnen Prioritäten der Aufgaben strikte Anforderungen an die Leistung stellen, die unabhängig voneinander zu erfüllen sind, benötigen Sie mehrere Consumer-Pools.
  • Bedarf an hoher Zuverlässigkeit: Sie benötigen mehrere Consumer-Pools bei Anwendungen, bei denen es auf Zuverlässigkeit und Fehlereingrenzung ankommt. Probleme, die in einer Warteschlange auftreten, dürfen andere Warteschlangen nicht beeinträchtigen.
  • Komplexe Anwendungen: Mehrere Warteschlangen sind bei komplexen Anwendungen nützlich, bei denen Aufgaben ausgeführt werden, die unterschiedliche Verarbeitungseigenschaften und Leistungsgarantien aufweisen.

Diagramm zur Veranschaulichung der Verwendung separater Nachrichtenwarteschlangen für jede Priorität.
Abbildung 2. Architektur von mehreren Warteschlangen mit mehreren Consumer-Pools.

Ein einziger Consumer-Pool

Wenn Sie einen einzigen Consumer-Pool nutzen, wird ein Consumer-Pool von allen Warteschlangen gemeinsam verwendet. Nachrichten aus der Warteschlange, der die höchste Priorität zugewiesen wurde, werden von den Consumern als erstes verarbeitet. Nachrichten aus Warteschlangen, die eine geringere Priorität besitzen, werden erst verarbeitet, wenn kein Nachrichten mit hoher Priorität vorliegen. Dementsprechend werden Nachrichten mit höherer Priorität vom einzelnen Consumer-Pool immer vor den Nachrichten verarbeitet, die eine geringere Priorität aufweisen. Bei dieser Konfiguration werden Nachrichten, die eine niedrige Priorität aufweisen, möglicherweise kontinuierlich aufgeschoben und vielleicht nie verarbeitet.

Ein einziger Consumer-Pool eignet sich für die folgenden Fälle:

  • Einfache Verwaltung: Ein einziger Consumer-Pool ist bei Anwendungen geeignet, bei denen die Konfiguration und die Wartung unkompliziert sein müssen. Damit werden die Konfiguration und die Überwachung vereinfacht.
  • Einheitliche Anforderungen an die Verarbeitung: Die Verwendung eines einzigen Consumer-Pools ist sinnvoll, wenn die auszuführenden Aufgaben einander ähneln.

Diagramm zur Veranschaulichung der Verwendung separater Nachrichtenwarteschlangen für jede Priorität.
Abbildung 3. Architektur von mehreren Warteschlangen mit einem einzigen Consumer-Pool.

Empfehlungen für das Muster der Prioritätswarteschlange

Wenn Sie die Implementierung des Musters der Prioritätswarteschlange planen, beachten Sie folgende Empfehlungen:

Allgemeine Empfehlungen

  • Definieren Sie die Prioritäten eindeutig. Bestimmen Sie deutlich abgegrenzte und klar definierte Prioritätsstufen, die auf Ihre Lösung zugeschnitten sind. Beispiel: Eine Nachricht, die hohe Priorität besitzt, muss innerhalb von 10 Sekunden verarbeitet werden. Bestimmen Sie, welche Anforderungen hinsichtlich der Verwaltung von Objekten mit hoher Priorität bestehen, und teilen Sie demzufolge die nötigen Ressourcen zu.

  • Richten Sie die Consumer-Pools dynamisch aus. Passen Sie die Größe der Consumer-Pools an die Länge der Warteschlange an, die sie bedienen.

  • Weisen Sie den Serviceleveln Prioritäten zu. Führen Sie Prioritätswarteschlangen an, damit Sie geschäftlichen Anforderungen gerecht werden, die eine priorisierte Verfügbarkeit oder Leistung vorgeben. Beispiel: Das Servicelevel unterscheidet sich je nach Kundengruppe: Kunden, denen eine hohe Priorität zugewiesen wurde, profitieren also von einer höheren Leistung und Verfügbarkeit.

  • Gewährleisten Sie, dass Objekte mit geringer Priorität verarbeitet werden. Wenn Sie Warteschlangen nutzen, die die Priorisierung von Nachrichten unterstützen, sollten Sie die Priorität von alten Nachrichten dynamisch erhöhen, sofern dies im System möglich ist. So gewährleisten Sie, dass auch Nachrichten mit geringer Priorität irgendwann verarbeitet werden.

  • Denken Sie an die Kosten der Warteschlange. Berücksichtigen Sie die Kosten und Verarbeitungskosten von Überprüfungswarteschlangen. Bei manchen Warteschlangendiensten fallen Gebühren für den Versand, den Abruf und das Abfragen von Nachrichten an. Diese Gebühren erhöhen sich möglicherweise, je mehr Warteschlangen Sie nutzen.

Empfehlungen für die Verwendung mehrerer Warteschlangen

  • Überwachen Sie die Geschwindigkeit der Verarbeitung. Überwachen Sie fortlaufend die Verarbeitungsgeschwindigkeit von Warteschlangen mit hoher und niedriger Priorität, um sicherzustellen, dass Nachrichten mit der erwarteten Geschwindigkeit verarbeitet werden.

  • Verringerung der Kosten. Sorgen Sie dafür, dass wichtige Aufgaben umgehend durch die verfügbaren Consumer verarbeitet werden. Planen Sie Hintergrundaufgaben, die weniger wichtig sind, für Zeiträume mit geringerer Auslastung ein.

Empfehlungen für die Verwendung eines einzigen Consumer-Pools

  • Implementieren Sie die vorzeitige Entfernung und die Aussetzung. Legen Sie fest, ob alle Objekte mit hoher Priorität vor sämtlichen Objekten mit niedrigerer Priorität verarbeitet werden müssen. Nutzen Sie einen Algorithmus, der gewährleistet, dass Warteschlangen, die eine hohe Priorität besitzen, immer vor Warteschlangen mit geringerer Priorität bedient werden, wenn für mehrere Warteschlangen ein einziger Consumer-Pool verwendet wird.

  • Kostenoptimierung. Verringern Sie die Anzahl der Consumer, wenn Sie eine einzige Warteschlange verwenden, um die Betriebskosten zu senken. Nachrichten mit hoher Priorität werden zuerst verarbeitet, wenn auch möglicherweise langsamer, und Nachrichten mit geringerer Priorität werden möglicherweise länger aufgeschoben.

Workloadentwurf

Ein Architekt sollte evaluieren, wie das Muster der Prioritätswarteschlange verwendet werden kann, um die Ziele und Prinzipien zu erreichen, die in den Azure Well-Architected Framework-Säulen behandelt werden. Zum Beispiel:

Säule So unterstützt dieses Muster die Säulenziele
Zuverlässigkeitsdesignentscheidungen tragen dazu bei, dass Ihre Workload ausfallsicher wird und dass sie nach einem Ausfall wieder in einen voll funktionsfähigen Zustand zurückkehrt. Durch die Trennung von Aufgaben auf der Grundlage der geschäftlichen Priorität können Sie Ihre Bemühungen um die Zuverlässigkeit auf die wichtigsten Aufgaben konzentrieren.

- RE:02 Kritische Flows
- RE:07 Hintergrundaufträge
Die Leistungseffizienz hilft Ihrer Workload, Anforderungen effizient durch Optimierungen in Skalierung, Daten und Code zu erfüllen. Die Trennung von Aufgaben nach geschäftlicher Priorität ermöglicht es Ihnen, die Leistungsbemühungen auf die zeitkritischsten Aufgaben zu konzentrieren.

- PE:09 Kritische Flows

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.

Beispiel für das Muster der Prioritätswarteschlange

Im folgenden Beispiel in GitHub wird eine Implementierung des Musters der Prioritätswarteschlange gezeigt, bei der Azure Service Bus genutzt wird.

Diagramm zum Implementieren einer Prioritätswarteschlange mithilfe von Service Bus
Abbildung 4. Architektur der Prioritätswarteschlange – Beispiel in GitHub

Hier ist eine Übersicht über die Architektur:

  • Anwendung (Producer): Im Beispiel gibt es die Anwendung (PriorityQueueSender), die Nachrichten erstellt und jeder Nachricht eine benutzerdefinierte Eigenschaft namens Priority zuteilt. Priority hat den Wert High oder Low.

  • Nachrichtenbroker und Warteschlangen: In diesem Beispiel fungiert Azure Service Bus als Nachrichtenbroker. Dabei werden zwei Azure Service Bus-Warteschlangen eingesetzt, für jede Nachrichtenpriorität (High und Low) eine. Die Anwendung (Producer) sendet Nachrichten entsprechend ihrer jeweiligen Priorität (Priority) an die zugehörige Warteschlange.

  • Mehrere Consumer-Pools: In diesem Beispiel werden mehrere Consumer-Pools (PriorityQueueConsumerHigh und PriorityQueueConsumerLow) eingesetzt, die Nachrichten aus den einzelnen Warteschlangen lesen.

Rolle in der Architektur des Beispiels Azure-Dienst im Beispiel Name im Beispiel
Application Azure Functions-App PriorityQueueSender
Nachrichtenbroker der Warteschlange Azure Service Bus <Namespace Ihres Service Bus>
Nachrichtenwarteschlangen Azure Service Bus-Warteschlangen <Namen Ihrer Warteschlangen>
Consumer Azure Functions-App PriorityQueueConsumerHigh
PriorityQueueConsumerLow

Die folgenden Muster können für Sie beim Implementieren hilfreich sein:

  • Muster der konkurrierenden Consumer: Bei diesem Muster werden mehrere Consumer implementiert, die dieselben Warteschlangen abhören und Aufgaben parallel verarbeiten, damit ein höherer Durchsatz erzielt wird. Nur ein Consumer verarbeitet jeweils eine Nachricht. In diesem Artikel finden Sie detaillierte Informationen zu den Vorteilen und Nachteilen dieser Herangehensweise.

  • Muster der Drosselung: Zur Implementierung dieses Musters werden Warteschlangen zur Verwaltung der Anforderungsraten verwendet. Indem Nachrichten priorisiert werden, erhalten Anforderungen von wichtigen Anwendungen oder Kunden mit hohem Wert Vorrang vor den weniger wichtigen.