Freigeben über


Muster für konkurrierende Verbraucher

Den mehreren gleichzeitigen Verbrauchern die Verarbeitung von Nachrichten ermöglichen, die auf dem gleichen Nachrichtenkanal empfangen werden. Mit mehreren gleichzeitigen Verbrauchern kann ein System mehrere Nachrichten gleichzeitig verarbeiten, um den Durchsatz zu optimieren, Skalierbarkeit und Verfügbarkeit zu verbessern und die Arbeitsauslastung auszugleichen.

Kontext und Problem

Eine Cloudanwendung verarbeitet häufig eine große Anzahl von Anforderungen. Anstatt jede Anforderung synchron zu verarbeiten, kann die Anwendung Anforderungen über ein Messagingsystem an einen Consumerdienst übergeben, der sie asynchron verarbeitet. Diese Strategie verhindert, dass die Anforderungsverarbeitung Anwendungsgeschäftslogik blockiert.

Die Anzahl der Anforderungen kann im Laufe der Zeit erheblich variieren. Eine plötzliche Zunahme der Benutzeraktivität oder aggregierter Anforderungen von mehreren Mandanten kann zu einer unvorhersehbaren Arbeitsauslastung führen. Zu Spitzenzeiten muss ein System möglicherweise viele Hundert Anforderungen pro Sekunde verarbeiten. Manchmal ist die Zahl möglicherweise klein. Außerdem kann die für die Verarbeitung dieser Anforderungen erforderliche Arbeit stark variieren. Wenn Sie eine einzelne Consumerdienstinstanz verwenden, können Anforderungen diese Instanz überwältigen. Oder ein Zustrom von Anwendungsnachrichten kann das Messaging-System überladen.

Um diese schwankende Workload zu bewältigen, kann das System mehrere Consumerdienstinstanzen ausführen. Das System muss diese Verbraucher jedoch koordinieren, um sicherzustellen, dass jede Nachricht nur an einen Einzelnen übermittelt wird. Das System muss auch die Arbeitsauslastung zwischen den Nutzern ausgleichen, um zu verhindern, dass eine Instanz zu einem Engpass wird.

Lösung

Verwenden Sie eine Nachrichtenwarteschlange, um den Kommunikationskanal zwischen der Anwendung und den Verbraucherdienstinstanzen zu implementieren. Die Anwendung sendet Anforderungen als Nachrichten an die Warteschlange, und Verbraucherdienstinstanzen empfangen und verarbeiten Nachrichten aus der Warteschlange. Mit diesem Ansatz kann derselbe Pool von Consumerdienstinstanzen Nachrichten von jeder Instanz der Anwendung verarbeiten. Das folgende Diagramm zeigt, wie eine Nachrichtenwarteschlange Arbeit an Dienstinstanzen verteilt.

Diagramm, das zeigt, wie eine Nachrichtenwarteschlange Arbeit an Dienstinstanzen verteilt.

Hinweis

Mehrere Verbraucher erhalten diese Nachrichten, aber das Muster konkurrierender Verbraucher unterscheidet sich vom Publisher-Subscriber Muster. Im Muster konkurrierender Verbraucher erhält ein Verbraucher jede Nachricht zur Verarbeitung. Im Publisher-Subscriber Muster erhalten alle Verbraucher jede Nachricht.

Diese Lösung hat folgende Vorteile:

  • Es stellt ein System mit Ladeebene bereit, das breite Variationen des Anforderungsvolumes von Anwendungsinstanzen verarbeiten kann. Die Warteschlange fungiert als Puffer zwischen Anwendungsinstanzen und Consumerdienstinstanzen. Dieser Puffer kann den Effekt auf die Verfügbarkeit und Reaktionsfähigkeit sowohl für die Anwendungs- als auch für Dienstinstanzen minimieren. Weitere Informationen finden Sie unter Warteschlangenbasiertes Belastungsausgleichsmuster. Eine Nachricht, die eine lange Verarbeitung erfordert, verhindert nicht, dass andere Verbraucherdienstinstanzen gleichzeitig andere Nachrichten verarbeiten.

  • Dadurch wird die Zuverlässigkeit verbessert. Wenn ein Produzent direkt mit einem Verbraucher kommuniziert, anstatt dieses Muster zu verwenden und den Verbraucher nicht zu überwachen, besteht eine hohe Wahrscheinlichkeit, dass Nachrichten verloren gehen oder nicht verarbeitet werden, wenn der Verbraucher fehlschlägt. In diesem Muster sendet das System keine Nachrichten an eine bestimmte Dienstinstanz. Eine fehlgeschlagene Dienstinstanz blockiert keinen Produzenten, und jede funktionierende Dienstinstanz kann Nachrichten verarbeiten.

  • Es ist keine komplexe Koordinierung zwischen Verbrauchern oder zwischen Produzenten- und Verbraucherinstanzen erforderlich. Die Nachrichtenwarteschlange stellt sicher, dass jede Nachricht mindestens einmal übermittelt wird.

  • Es skaliert. Wenn Sie die automatische Skalierung anwenden, kann das System die Anzahl der Consumerdienstinstanzen dynamisch erhöhen oder verkleinern, da das Nachrichtenvolumen schwankt.

  • Dies kann die Resilienz verbessern, wenn die Nachrichtenwarteschlange transaktionale Lesevorgänge bereitstellt. Wenn eine Consumerdienstinstanz eine Nachricht als Teil eines Transaktionsvorgangs liest und verarbeitet und fehlschlägt, kann dieses Muster sicherstellen, dass die Nachricht an die Warteschlange zurückgegeben wird, damit eine andere Consumerdienstinstanz sie verarbeiten kann. Um das Risiko fortlaufender Nachrichtenfehler zu verringern, empfehlen wir, dass Sie Dead-Letter-Queues verwenden.

Probleme und Überlegungen

Berücksichtigen Sie die folgenden Punkte, wenn Sie sich für die Implementierung dieses Musters entscheiden:

  • Nachrichtenbestellung: Die Reihenfolge, in der Verbraucherdienstinstanzen Nachrichten empfangen, ist nicht garantiert und zeigt nicht unbedingt die Reihenfolge an, in der die Nachrichten erstellt wurden. Entwerfen Sie das System so, dass es Nachrichten idempotent verarbeitet. Dieses Design hilft dabei, Abhängigkeiten von Verarbeitungsreihenfolgen zu beseitigen.

    Azure Service Bus kann die garantierte First-in-First-Out-Reihenfolge von Nachrichten und anderen Mustern mithilfe von Nachrichtensitzungen implementieren.

  • Anforderungen an die Dienstresilienz: Wenn das System fehlerhafte Dienstinstanzen erkennt und neu startet, muss es möglicherweise die Vorgänge implementieren, die diese Dienstinstanzen als idempotent ausführen, um die Auswirkungen beim Abrufen und Verarbeiten einer einzelnen Nachricht mehrmals zu minimieren.

  • Erkennung von Giftnachrichten: Eine falsch formatierte Nachricht oder eine Aufgabe, die Zugriff auf ressourcen erfordert, die nicht verfügbar sind, kann dazu führen, dass eine Dienstinstanz fehlschlägt. Das System sollte verhindern, dass diese Nachrichten auf unbestimmte Zeit in die Warteschlange zurückkehren und stattdessen ihre Details bei Bedarf erfassen und speichern. Der Servicebus kann Nachrichten automatisch an eine Warteschlange mit inaktiven Briefen senden, nachdem die Anzahl der Zustellungen den konfigurierten MaxDeliveryCount Schwellenwert überschritten hat.

  • Ergebnisbehandlung: Die Dienstinstanz, die eine Nachricht verarbeitet, wird vollständig von der Anwendungslogik entkoppelt, die die Nachricht generiert, sodass sie möglicherweise nicht direkt kommunizieren können. Wenn die Dienstinstanz Ergebnisse generiert, die zur Anwendungslogik zurückkehren müssen, speichern Sie diese Informationen an einem Speicherort, auf den beide Komponenten zugreifen können. Um zu verhindern, dass die Anwendungslogik unvollständige Daten abruft, muss das System angeben, wann die Verarbeitung abgeschlossen ist. Ein Arbeitsprozess kann Ergebnisse über eine dedizierte Nachrichtenantwortwarteschlange an die Anwendungslogik zurückgeben. Die Anwendungslogik muss in der Lage sein, diese Ergebnisse mit der ursprünglichen Nachricht zu korrelieren.

  • Skalierung des Messagingsystems: In einer umfangreichen Lösung kann ein hohes Nachrichtenvolumen eine einzelne Nachrichtenwarteschlange überwältigen und zu einem Systemengpass werden. In diesem Fall sollten Sie die Partitionierung des Messagingsystems in Betracht ziehen, um Nachrichten von bestimmten Produzenten an eine bestimmte Warteschlange zu senden, oder den Lastenausgleich zum Verteilen von Nachrichten über mehrere Nachrichtenwarteschlangen hinweg.

  • Zuverlässigkeit des Messagingsystems: Verwenden Sie ein zuverlässiges Messaging-System, um sicherzustellen, dass Nachrichten nicht verloren gehen, nachdem die Anwendung sie in die Warteschlange gestellt hat. Diese Funktion ist unerlässlich, um sicherzustellen, dass alle Nachrichten mindestens einmal übermittelt werden.

Wann Sie dieses Muster verwenden sollten

Verwenden Sie dieses Muster in folgenden Fällen:

  • Die Anwendungsauslastung ist in Aufgaben unterteilt, die asynchron ausgeführt werden können.

  • Aufgaben sind unabhängig voneinander und können parallel ausgeführt werden.

  • Das Arbeitsvolumen ist sehr variabel und erfordert eine skalierbare Lösung.

  • Die Lösung muss hohe Verfügbarkeit bereitstellen und stabil bleiben, wenn die Aufgabenverarbeitung fehlschlägt.

Dieses Muster ist möglicherweise nicht geeignet, wenn:

  • Sie können die Anwendungsarbeitsauslastung nicht einfach in diskrete Aufgaben trennen, oder es gibt ein hohes Maß an Abhängigkeit zwischen Vorgängen.

  • Aufgaben müssen synchron ausgeführt werden, und die Anwendungslogik muss warten, bis jede Aufgabe abgeschlossen ist, bevor sie fortgesetzt wird.

  • Aufgaben müssen in einer bestimmten Reihenfolge ausgeführt werden.

Hinweis

Einige Messagingsysteme unterstützen Sitzungen, die es einem Produzenten ermöglichen, Nachrichten zusammenzuführen und sicherzustellen, dass derselbe Verbraucher alle Nachrichten in der Gruppe verarbeitet. Sie können diesen Mechanismus mit priorisierten Nachrichten verwenden, wenn diese unterstützt werden, um nachrichtenreihenfolgen zu erzwingen und Nachrichten sequenziert von einem Produzenten an einen einzelnen Verbraucher zu übermitteln.

Arbeitslastgestaltung

Bewerten Sie, wie Sie das Muster "Konkurrierende Verbraucher" in das Design einer Workload integrieren, um die Ziele und Prinzipien zu adressieren, die in den Azure Well-Architected Framework-Säulen behandelt werden. 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ässigkeitsentwurfsentscheidungen helfen Ihrer Arbeitsauslastung, ausfallsicher zu werden und sicherzustellen, dass sie nach auftreten eines Fehlers wieder in einen voll funktionsfähigen Zustand versetzt wird. Dieses Muster schafft Redundanz bei der Warteschlangenverarbeitung, indem Verbraucher als Replikate behandelt werden, sodass ein Instanzausfall andere Verbraucher nicht daran hindert, Warteschlangennachrichten zu verarbeiten.

- RE:05 Redundanz
- Hintergrundaufträge
Die Kostenoptimierung konzentriert sich auf die Erhaltung und Verbesserung der Kapitalrendite Ihres Workloads. Dieses Muster kann bei der Optimierung der Kosten helfen, da sie basierend auf der Warteschlangentiefe skaliert und bei leerer Warteschlange auf Null skaliert werden kann. Es kann auch kostenoptimiert werden, da Sie die maximale Anzahl gleichzeitiger Consumerinstanzen einschränken können.

- CO:05 Ratenoptimierung
- CO:07 Komponentenkosten
Performance Efficiency hilft Ihrem Workload durch Optimierungen bei Skalierung, Daten und Code, die Anforderungen effizient zu erfüllen . Dieses Muster verteilt die Last über die Konsumentenknoten, um die Auslastung zu erhöhen, und die dynamische Skalierung basierend auf der Warteschlangentiefe minimiert die Überbereitstellung.

- PE:05 Skalierung und Partitionierung
- PE:07-Code und -Infrastruktur

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

Beispiel

Azure stellt Service Bus-Warteschlangen und Azure Functions-Warteschlangentrigger bereit, die dieses Clouddesignmuster direkt implementieren. Die Integration von Funktionen mit dem Service Bus erfolgt durch Trigger und Bindungen. Mit dieser Integration können Sie Funktionen erstellen, die Warteschlangennachrichten von Herausgebern nutzen. Durch das Veröffentlichen von Anwendungen werden Nachrichten in einer Warteschlange veröffentlicht, und Verbraucher, die als Funktionen implementiert werden, können diese Nachrichten abrufen und verarbeiten.

Zur Erhöhung der Ausfallsicherheit ermöglicht eine Servicebus-Warteschlange einem Konsumenten die Verwendung des PeekLock-Modus, wenn eine Nachricht aus der Warteschlange abgerufen wird. Dieser Modus behält die Nachricht bei, blendet sie aber von anderen Verbrauchern aus. Die Funktionslaufzeit empfängt eine Nachricht im PeekLock-Modus. Wenn die Funktion erfolgreich abgeschlossen wird, ruft die Laufzeit Complete mit der Nachricht auf. Wenn die Funktion fehlschlägt, könnte die Laufzeit Abandon aufrufen und die Nachricht wieder sichtbar machen, damit ein anderer Verbraucher sie abrufen kann. Wenn die Funktion länger als das PeekLock-Timeout ausgeführt wird, verlängert die Laufzeit die Sperre automatisch, solange die Funktion ausgeführt wird.

Diagramm, das Service Bus verwendet, um Arbeit an Funktionen zu verteilen.

Funktionen skalieren automatisch die Anzahl der Consumerinstanzen basierend auf der Warteschlangentiefe und dem Datenverkehr. Diese Skalierung ermöglicht es der Lösung, Brüche der Arbeit zu bewältigen und gleichzeitig die Kosten während weniger Volumenperioden zu minimieren. Wenn Funktionen mehrere Instanzen erstellen, konkurrieren sie durch unabhängiges Abrufen und Verarbeiten von Nachrichten. Weitere Informationen finden Sie unter Service Bus-Warteschlangen, Themen und Abonnements undService Bus-Trigger für Funktionen.

Weitere Informationen zur Verwendung der ServiceBus-Clientbibliothek für .NET zum Senden von Nachrichten an eine ServiceBus-Warteschlange finden Sie in den veröffentlichten Beispielen.

Nächste Schritte

  • Wählen Sie einen Messagingdienst in Azure aus: Erfahren Sie, wie verschiedene Azure-Messagingdienste wie Service Bus, Azure Storage-Warteschlangen, Azure Event Hubs und Azure Event Grid asynchrone Kommunikationsmuster unterstützen und wie Sie das richtige Dienst- und Messagingmodell für Ihr Szenario auswählen.

  • Bewährte Methoden für die automatische Skalierung: Erfahren Sie, wie Sie Lösungen entwerfen, die Verbraucherinstanzen basierend auf arbeitslasten, z. B. Warteschlangenlänge oder Nachrichtendurchsatz, skalieren, sodass Sie Spitzenlasten und Steuerungskosten in Zeiträumen geringer Aktivität verarbeiten können.

  • Berechnungsressourcenkonsolidierungsmuster: Möglicherweise können Sie mehrere Instanzen eines Consumerdiensts in einem einzigen Prozess konsolidieren, um Kosten und Verwaltungsaufwand zu reduzieren. Das Berechnungsressourcenkonsolidierungsmuster beschreibt die Vorteile und Kompromisse dieses Ansatzes.

  • Warteschlangenbasiertes Lastenausgleichsmuster: Eine Nachrichtenwarteschlange kann dem System Resilienz hinzufügen. Mithilfe der Resilienz können Dienstinstanzen weit unterschiedliche Mengen von Anforderungen von Anwendungsinstanzen verarbeiten. Die Nachrichtenwarteschlange fungiert als Puffer, der die Last abgibt. Das Warteschlangenbasierte Lastenausgleichsmuster beschreibt dieses Szenario ausführlicher.