Freigeben über


Muster „Prioritätswarteschlange“

Azure Service Bus

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

Workloads müssen oft Aufgaben mit unterschiedlichen Wichtigkeits- und Dringlichkeitsgraden verwalten und bearbeiten. Manche Aufgaben müssen sofort bearbeitet werden, bei anderen besteht weniger Eile. Das Versäumnis, Aufgaben mit hoher Priorität zu adressieren, kann die Benutzererfahrung beeinträchtigen und Service-Level-Vereinbarungen (SLAs) verletzen.

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

Prioritätswarteschlangen ermöglichen es, dass Workloads Aufgaben gemäß ihrer Priorität und nicht in der Reihenfolge ihres Eintreffens verarbeiten. 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.

  • Unterschiedliche Service-Level-Vereinbarungen verwalten. 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.

  • Unterschiedliche Bedürfnisse hinsichtlich der Workload-Verwaltung berücksichtigen. 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.

Einzelne 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. Die Anwendung weist jeder Nachricht eine Priorität zu und leitet sie basierend auf dieser Priorität in die entsprechende Warteschlange. Die Konsumenten verarbeiten die Nachrichten. 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 mit höherer Priorität sollten mehr Verbraucher oder höhere Leistungsebenen nutzen, um Nachrichten schneller zu verarbeiten als Warteschlangen mit niedrigerer Priorität.

Verwenden Sie mehrere Consumer-Pools in folgenden Fällen:

  • 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: Vorteilhaft für komplexe Anwendungen mit Aufgaben, die unterschiedliche Verarbeitungseigenschaften und Leistungsgarantien für verschiedene Aufgaben erfordern.

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

Ein einziger Consumer-Pool

Bei einem einzigen Consumer-Pool teilen sich alle Warteschlangen denselben Pool von Verbrauchern. Verbraucher verarbeiten zuerst Nachrichten aus der Warteschlange mit der höchsten Priorität und verarbeiten Nachrichten aus Warteschlangen mit geringerer Priorität erst, wenn keine 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 die gleiche Natur haben.

Diagramm zur Veranschaulichung der Verwendung separater Nachrichtenwarteschlangen für jede Priorität.
Abbildung 3. Architektur von mehreren Warteschlangen und 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 eine Verarbeitung mit geringer Priorität. 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 finanzielle Belastung und die Verarbeitungskosten, die im Zusammenhang mit Überprüfungswarteschlangen stehen. 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 mehrere 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. Stellen Sie sicher, dass kritische Aufgaben sofort von den verfügbaren Verbrauchern 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 das Unterbrechen und das Aussetzen. Legen Sie fest, ob alle Objekte mit hoher Priorität vor sämtlichen Objekten mit niedrigerer Priorität verarbeitet werden müssen. Verwenden Sie einen Algorithmus, der sicherstellt, dass Warteschlangen mit hoher Priorität immer vor Warteschlangen mit niedrigerer Priorität gewartet werden, wenn Sie einen einzelnen Verbraucherpool für mehrere Warteschlangen verwenden.

  • Kostenoptimierung. Optimieren Sie die Betriebskosten, indem Sie die Anzahl der Verbraucher zurückskalieren, wenn Sie den Single-Queue-Ansatz verwenden. 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 bewerten, wie das Muster "Prioritätswarteschlange" die in den Azure Well-Architected Framework-Säulen behandelten Ziele und Prinzipien erfüllen kann. 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 Abläufe
- RE:07 Hintergrundaufträge
Die Leistungseffizienz unterstützt Ihre Workload dabei, Anforderungen effizient durch die Optimierung von 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 "Priority Queues" mithilfe von Azure Service Bus veranschaulicht.

Diagramm, das zeigt, wie Sie eine Prioritätswarteschlange mithilfe von Service Bus implementieren.
Abbildung 4. Architektur des PriorityQueue-Beispiels 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: Im Beispiel wird Azure Service Bus als Nachrichtenbroker verwendet. Es verwendet zwei Azure Service Bus Warteschlangen, eine für jede Nachrichtenpriorität (High und Low). Die Anwendung (Produzent) sendet Nachrichten basierend auf dem Nachrichtentext (Priority) an die korrekte 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 Beispielarchitektur Azure-Dienst im Beispiel Name im Beispiel
Anwendung Azure Functions App PriorityQueueSender
Nachrichten-Warteschlangen-Broker Azure Service Bus < Ihr Servicebus-Namespace>
Nachrichtenwarteschlangen Azure Service Bus Warteschlangen < Namen Ihrer Warteschlangen>
Verbraucher Azure Functions App PriorityQueueConsumerHigh
PriorityQueueConsumerLow

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

  • Competing Consumers Pattern: Bei diesem Pattern werden mehrere Consumer implementiert, die in denselben Warteschlangen auf Aufgaben warten und diese parallel verarbeiten, um den Durchsatz zu erhöhen. Nur ein Verbraucher 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.