Muster „Prioritätswarteschlange“

Priorisieren Sie Anforderungen, die an Dienste gesendet werden, damit eine Workload Anforderungen mit hoher Priorität schneller verarbeitet als solche mit niedrigerer Priorität. Dieser Ansatz verwendet Nachrichten, die an eine oder mehrere Warteschlangen gesendet werden, und ist nützlich für Anwendungen, die unterschiedliche Servicelevels oder Vereinbarungen auf Serviceebene (Service Level Agreements, SLAs) für unterschiedliche Anforderungstypen oder Kunden bereitstellen.

Kontext und Problem

Workloads müssen möglicherweise Aufgaben mit unterschiedlicher Wichtigkeit und Dringlichkeit verwalten und verarbeiten. Manche Aufgaben müssen sofort bearbeitet werden, bei anderen besteht weniger Eile. Fehler bei der Behebung von Aufgaben mit hoher Priorität können sich auf die Benutzerfreundlichkeit und Sicherheitsverletzungen auswirken.

Um Aufgaben effizient basierend auf ihrer Priorität zu verarbeiten, benötigen Workloads einen Mechanismus, um Aufgaben entsprechend zu verarbeiten und auszuführen. Standardmäßig verarbeiten die meisten Workloads Aufgaben in der Reihenfolge, in der sie eingehen, mithilfe einer First-In-First-Out-Warteschlangenstruktur (First-In, First-Out, FIFO). Dieser Ansatz berücksichtigt keine unterschiedliche Aufgaben wichtigkeit.

Lösung

Prioritätswarteschlangen ermöglichen Workloads das Verarbeiten von Aufgaben basierend auf ihrer Priorität und nicht ausschließlich durch ihre Ankunftsreihenfolge. Die Anwendung oder der Produzent , die eine Anforderung sendet, weist der Nachricht einen Prioritätswert zu, und Verbraucher verarbeiten die Nachrichten nach Priorität. Das Muster "Priority Queue" erfüllt die folgenden Anforderungen:

  • Behandelt Aufgaben mit unterschiedlicher Dringlichkeit und Wichtigkeit: Sie haben Aufgaben mit unterschiedlicher Dringlichkeit und Wichtigkeit und müssen sicherstellen, dass Sie kritischere Vorgänge vor weniger kritischen Vorgängen verarbeiten.

  • Behandelt verschiedene SLAs: Sie bieten verschiedenen SLAs unterschiedliche Kunden an und müssen sicherstellen, dass Kunden mit hoher Priorität eine bessere Leistung und Verfügbarkeit erhalten.

  • Erfüllt unterschiedliche Workloadverwaltungsanforderungen: Sie verfügen über eine Arbeitsauslastung, die bestimmte Aufgaben sofort adressieren muss, während weniger dringende Aufgaben warten können.

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

  • Einzelne Warteschlange: Jeder Nachricht wird ein Prioritätswert zugewiesen, und alle Nachrichten verwenden dieselbe Warteschlange.

  • Mehrere Warteschlangen: Jeder Nachricht wird ein Prioritätswert zugewiesen, und Meldungen mit unterschiedlicher Priorität verwenden separate Warteschlangen.

Einzelne Warteschlange

Bei einem einzelnen Warteschlangenansatz weist die Anwendung jeder Nachricht eine Priorität zu und sendet alle Nachrichten an eine einzelne Warteschlange. 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, das einen Warteschlangenmechanismus veranschaulicht, der die Nachrichtenpriorisierung unterstützt.

Mehrere Warteschlangen

Mehrere Warteschlangen trennen Nachrichten nach Priorität. Die Anwendung weist jeder Nachricht eine Priorität zu und leitet die Nachricht an die Warteschlange weiter, die ihrer Priorität entspricht, wobei Verbraucher die Nachrichten verarbeiten. Eine Lösung mit mehreren Warteschlangen kann entweder einen einzelnen Verbraucherpool oder mehrere Consumerpools verwenden.

Ein einziger Consumer-Pool

In einem einzelnen Poolsetup verwenden alle Warteschlangen denselben Consumerpool. Verbraucher verarbeiten Nachrichten aus der Warteschlange mit der höchsten Priorität zuerst und verarbeiten Nachrichten aus Warteschlangen mit niedrigerer Priorität nur, wenn keine Nachrichten mit hoher Priorität mehr vorhanden sind. Daher verarbeiten einzelne Consumerpools immer Nachrichten mit höherer Priorität vor denen mit niedrigerer Priorität. Diese Einrichtung kann dazu führen, dass Nachrichten mit niedrigerer Priorität ständig verzögert und möglicherweise nie verarbeitet werden.

Diagramm, das die Verwendung eines einzelnen Consumerpools für alle Prioritäten veranschaulicht.

Verwenden Sie aus folgenden Gründen einen einzelnen Consumerpool:

  • Einfache Verwaltung. Verwenden Sie einen einzelnen Verbraucherpool, wenn einfache Einrichtung und Wartung prioritätsfrei ist. Ein einzelner Pool reduziert die Konfigurations- und Überwachungskomplexität.

  • Einheitliche Verarbeitungsanforderungen. Verwenden Sie einen einzelnen Consumerpool, wenn die eingehenden Aufgaben ähnlich sind.

Mehrere Consumer-Pools

In einem mehreren Consumerpool verfügt jede Warteschlange über einen dedizierten Consumerpool. Warteschlangen mit höherer Priorität verwenden mehr Verbraucher oder höhere Leistungsstufen, um Nachrichten schneller zu verarbeiten als Warteschlangen mit niedrigerer Priorität.

Diagramm, das die Verwendung separater Consumerpools für jede Priorität veranschaulicht.

Verwenden Sie aus folgenden Gründen mehrere Consumerpools:

  • Strenge Leistungsanforderungen. Verwenden Sie mehrere Consumerpools, wenn unterschiedliche Aufgabenprioritäten strenge Leistungsanforderungen aufweisen, die unabhängig voneinander erfüllt werden müssen.

  • Hohe Zuverlässigkeit. Verwenden Sie mehrere Consumerpools für Anwendungen, wenn Zuverlässigkeit und Fehlerisolation kritisch sind, und Probleme in einer Warteschlange dürfen sich nicht auf andere Warteschlangen auswirken.

  • Komplexe Anwendungen. Verwenden Sie mehrere Consumerpools für komplexe Anwendungen, bei denen unterschiedliche Verarbeitungsmerkmale und Leistungsgarantien erforderlich sind.

Probleme und Überlegungen

Beachten Sie die folgenden Punkte bei Ihrer Entscheidung, wie dieses Muster implementiert werden soll:

Allgemeine Empfehlungen

  • Definieren Sie die Prioritäten eindeutig. Legen Sie eindeutige und klare Prioritätsstufen fest, die für Ihre Lösung relevant sind. Sie können z. B. Nachrichten mit hoher Priorität als solche definieren, die innerhalb von 10 Sekunden Eine Verarbeitung erfordern. Identifizieren Sie die Verbraucheranforderungen für die Behandlung von Elementen mit hoher Priorität, und weisen Sie die erforderlichen Ressourcen entsprechend zu.

  • Richten Sie die Consumer-Pools dynamisch aus. Skalieren Sie die Größe von Consumerpools basierend auf der Länge der Warteschlange, die sie gewartet haben.

  • Überwachen der Warteschlangenintegrität. Verfolgen Sie die Warteschlangentiefe, die Verarbeitungslatenz, die Anzahl der Übermittlungen und den Durchsatz, damit Sie Backlogs und Verlangsamungen erkennen können, bevor sie sich auf die Arbeit auswirken.

  • Verwenden Sie Warteschlangen mit inaktiven Buchstaben. Verschieben Sie giftige Nachrichten nach einer konfigurierbaren Anzahl von Zustellungsversuchen in eine Warteschleife, sodass eine ungültige Nachricht den Prioritätspfad nicht blockiert.

  • 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. Kunden mit hoher Priorität können z. B. ein höheres Serviceniveau erhalten, sodass sie eine bessere Leistung und Verfügbarkeit erzielen.

  • Berücksichtigen Sie die Verarbeitung mit niedriger Priorität. Entscheiden Sie, ob alle Elemente mit hoher Priorität vor elementen mit niedrigerer Priorität verarbeitet werden müssen. Wenn möglich, erhöhen Sie die Priorität alter Nachrichten dynamisch, um sicherzustellen, dass Nachrichten mit niedriger Priorität schließlich verarbeitet werden.

  • Optimieren und Minimieren von 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.

    Wenn Sie eine einzelne Warteschlange verwenden, optimieren Sie die Kosten, indem Sie die Anzahl der Verbraucher zurückskalieren. Nachrichten mit hoher Priorität werden zuerst verarbeitet, aber möglicherweise langsamer, während Nachrichten mit niedrigerer Priorität möglicherweise längeren Verzögerungen ausgesetzt sind.

  • Schützen Sie Prozessoren vor Bedarfsspitzen. Wenn die Ankunftsrate des Herstellers die Verarbeitungskapazität der Verbraucher überschreiten kann, kombinieren Sie dieses Muster mit dem Queue-Based Lastenausgleichsmuster. Bei diesem Ansatz werden Datenverkehrsbrüche gepuffert und verhindert, dass nachgelagerte Verarbeitungsressourcen überlastet werden.

Empfehlungen für mehrere Warteschlangen

  • Überwachen Sie die Geschwindigkeit der Verarbeitung. Um sicherzustellen, dass Nachrichten mit den erwarteten Raten verarbeitet werden, überwachen Sie kontinuierlich die Verarbeitungsgeschwindigkeit von Warteschlangen mit hoher und niedriger Priorität.

  • Implementieren Sie das Unterbrechen und das Aussetzen. Wenn Sie mehrere Warteschlangen mit einem einzelnen Consumerpool verwenden, implementieren Sie einen Algorithmus, der sicherstellt, dass Warteschlangen mit hoher Priorität immer vor Warteschlangen mit niedrigerer Priorität gewartet werden.

  • Denken Sie an die Kosten der Warteschlange. Achten Sie auf die finanziellen Kosten, die mit der Überprüfung und Verarbeitung von Warteschlangen verbunden sind. Einige Warteschlangendienste berechnen Gebühren für die Buchung, das Abrufen und Abfragen von Nachrichten. Diese Gebühren können mit der Anzahl der Warteschlangen erhöht werden.

Wann dieses Muster verwenden

Verwenden Sie dieses Muster in folgenden Fällen:

  • Sie müssen unterschiedliche Latenz- oder Dienstebenenziele für verschiedene Arbeitsklassen erfüllen, z. B. Premium- und Standardkundenanforderungen.

  • Arbeit kommt in Brüchen ein, und Sie müssen kritische Vorgänge schützen, indem Sie nachrichten mit hoher Priorität zuerst verarbeiten, während sie die Arbeit mit niedrigerer Priorität zurückstellen.

Dieses Muster ist möglicherweise nicht geeignet, wenn:

  • Alle Arbeitsaufgaben haben eine ähnliche geschäftliche Bedeutung, und die strenge FIFO-Verarbeitung ist wichtiger als die prioritätsbasierte Planung.

  • Aufgaben weisen starke Anordnungsabhängigkeiten auf Prioritätsebenen auf, und das Neuanordnen der Arbeit nach Priorität kann zu inkonsistenten Ergebnissen führen oder eine komplexe Koordinationslogik erfordern.

Arbeitslastgestaltung

Bewerten Sie, wie Sie das Muster "Prioritätswarteschlange" im Entwurf einer Workload verwenden, um die in den Azure Well-Architected Framework-Säulen behandelten Ziele und Prinzipien zu erfüllen. Die folgende Tabelle enthält Anleitungen dazu, wie dieses Muster die Ziele jeder Säule unterstützt.

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
Performance Efficiency hilft Ihrem Workload durch Optimierungen bei Skalierung, Daten und Code, die Anforderungen effizient 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 Flüsse

Wenn dieses Muster Kompromisse innerhalb einer Säule einführt, sollten Sie sie gegen die Ziele der anderen Säulen berücksichtigen.

Beispiel

Das Musterbeispiel "Priority Queue" in GitHub veranschaulicht eine Implementierung des Musters "Prioritätswarteschlange", das Azure Service Bus Themen und Abonnements verwendet. Im Beispiel wird ein sicheres Speicherkonto, eine Application Insights-Ressource für die Überwachung und ein Service Bus Namespace bereitgestellt, um die Kommunikation zwischen absender- und Consumerfunktionen zu ermöglichen.

Die Bereitstellung umfasst drei Funktions-Apps: einen Absender und zwei Verbraucher. Die Consumer-Apps verwenden unterschiedliche maximale Instanzenanzahl, um die Nachrichtenpriorisierung zu simulieren. Die funcPriorityQueueConsumerHigh Funktion kann auf 200 Instanzen skaliert werden, während die funcPriorityQueueConsumerLow Funktion auf 40 Instanzen beschränkt ist. Alle Funktions-Apps verwenden den Flex-Verbrauchsplan und sind mit Application Insights für Diagnose und Überwachung verbunden.

Rollenzuweisungen gewähren sicheren Zugriff auf Service Bus und Speicher mithilfe von verwalteten Identitäten. Alle Funktions-Apps verwenden dasselbe Speicherkonto und die Application Insights-Ressource. Diese Konfiguration zentralisiert Observability und Protokollierung.

Das folgende Diagramm zeigt die Architektur der Prioritätswarteschlange:

Diagramm, das zeigt, wie Sie eine Prioritätswarteschlange mithilfe von Service Bus implementieren.

Im obigen Diagramm ist Folgendes zu sehen:

  1. Antrag (Produzent). Die PriorityQueueSender Anwendung erstellt Nachrichten, weist jeder Nachricht eine benutzerdefinierte Anwendungseigenschaft zu Priority und legt den Priority Wert auf High oder Low.

  2. Nachrichtenbroker und Thema. Der Service Bus Nachrichtenbroker sendet Nachrichten an ein einzelnes Service Bus Thema namens messages. Service Bus verwendet SQL-Filter, um jede Nachricht basierend auf ihrem Priority Wert an das Abonnement mit hoher Priorität oder niedriger Priorität weiterzuleiten.

  3. Mehrere Verbraucherpools. Die PriorityQueueConsumerHigh Pools und PriorityQueueConsumerLow Consumerpools reagieren mithilfe von Azure Functions Service Bus Triggern auf Nachrichten von Abonnements mit hoher Priorität oder niedriger Priorität.

Rolle im Beispiel Azure-Dienst im Beispiel Name im Beispiel
Anwendung (Produzent) Azure Functions App PriorityQueueSender
Nachrichtenbroker Azure-Servicebus <Ihr Servicebusnamespace>
Thema "Nachricht" Azure Service Bus-Thema messages
Nachrichtenabonnements Azure Service Bus-Abonnements highPriority
lowPriority
Verbraucher Azure Functions App PriorityQueueConsumerHigh
PriorityQueueConsumerLow

Nächste Schritte

  • Service Bus Warteschlangen, Themen und Abonnements: Überprüfen Sie die Service Bus Entitäten und die Unterschiede zwischen Warteschlangen und Themen.
  • Doppelte Erkennung: Erfahren Sie, wie Service Bus doppelte Nachrichten ablehnen können, wenn ein Absender nach einer unsicheren Übermittlung erneut wiederholt.
  • Warteschleifen: Erfahren Sie, wie Service Bus Nachrichten verschiebt, die nicht zur Untersuchung oder Neuverarbeitung in eine Warteschlange mit inaktiven Buchstaben verarbeitet werden können.
  • Was ist Azure Queue Storage?: Überprüfen Sie die Kernkonzepte von Azure Queue Storage, um sie mit Service Bus Warteschlangen zu vergleichen.

Die folgenden Muster sind möglicherweise hilfreich, wenn Sie dieses Muster implementieren:

  • Queue-Based Load Leveling-Muster: Verwenden Sie eine Warteschlange als Puffer zwischen Anforderungsaufnahme und Verarbeitung. Verwenden Sie es mit dem Muster "Prioritätswarteschlange", wenn Sie sowohl Platzschutz als auch differenzierte Behandlung benötigen.

  • Konkurrierende Verbrauchermuster: Implementieren Sie mehrere Verbraucher, die die gleichen Warteschlangen- und Prozessaufgaben parallel überwachen, um den Durchsatz zu erhöhen. Nur ein Verbraucher verarbeitet jeweils eine Nachricht.

  • Einschränkungsmuster: Implementieren Sie Drosselung mithilfe von Warteschlangen zum Verwalten von Anforderungsraten. Verwenden Sie Prioritätsnachrichten, um Anforderungen von kritischen Anwendungen oder hochwertigen Kunden über weniger wichtige zu priorisieren.