Teil 4: RabbitMQ Exchanges, Routing Keys und Bindings

Was ist ein Exchange? Was sind Routing Keys und Bindungen? Wie sind Exchanges und Queues miteinander verbunden? Wann und wie sollte ich sie verwenden? Dieser Artikel erklärt die verschiedenen Arten von Exchanges in RabbitMQ und Szenarien, wie sie verwendet werden können.

Nachrichten werden nicht direkt in eine Warteschlange veröffentlicht. Stattdessen sendet der Producer Nachrichten an einen Exchange. Exchanges sind Nachrichten-Routing-Agenten, die durch den virtuellen Host innerhalb von RabbitMQ definiert werden. Ein Exchange ist verantwortlich für das Routing der Nachrichten an verschiedene Queues mit Hilfe von Header-Attributen, Bindings und Routing-Schlüsseln.

Abinding ist ein „Link“, den man einrichtet, um eine Queue an einen Exchange zu binden.

Der Routing-Schlüssel ist ein Nachrichtenattribut, das der Exchange berücksichtigt, wenn er entscheidet, wie er die Nachricht an die Warteschlangen weiterleitet (abhängig vom Exchange-Typ).

Austausche, Verbindungen und Warteschlangen können mit Parametern wie dauerhaft, temporär und automatisches Löschen bei der Erstellung konfiguriert werden. Dauerhafte Austausche überleben Server-Neustarts und bleiben bestehen, bis sie explizit gelöscht werden. Temporäre Austausche bestehen, bis RabbitMQ heruntergefahren wird. Automatisch gelöschte Exchanges werden entfernt, sobald das letzte gebundene Objekt aus dem Exchange entfernt wurde.

In RabbitMQ gibt es vier verschiedene Typen von Exchanges, die die Nachricht mit unterschiedlichen Parametern und Bindungseinstellungen unterschiedlich weiterleiten. Clients können ihre eigenen Exchanges erstellen oder die vordefinierten Standard-Exchanges verwenden, die beim ersten Start des Servers erstellt werden.

  1. Der Producer veröffentlicht eine Nachricht an den Exchange.
  2. Der Exchange empfängt die Nachricht und ist nun für das Routing der Nachricht verantwortlich.
  3. Binding muss zwischen der Queue und dem Exchange eingerichtet werden. In diesem Fall haben wir Bindungen zu zwei verschiedenen Warteschlangen von der Vermittlungsstelle. Die Vermittlungsstelle leitet die Nachricht in die Warteschlangen.
  4. Die Nachrichten bleiben in der Warteschlange, bis sie von einem Verbraucher verarbeitet werden.
  5. Der Verbraucher verarbeitet die Nachricht.

Wenn Sie mit RabbitMQ und Message Queueing nicht vertraut sind, lesen SieRabbitMQ für Anfänger – was ist RabbitMQ?bevor Sie über Exchanges, Routing Keys, Header und Bindings lesen.

Direct Exchange

Ein direkter Exchange liefert Nachrichten an Queues basierend auf einem Message Routing Key. Der Routing-Schlüssel ist ein Nachrichtenattribut, das der Produzent dem Nachrichtenkopf hinzufügt. Eine Nachricht geht an die Warteschlange(n) mit dem Bindungsschlüssel, der genau mit dem Routing-Schlüssel der Nachricht übereinstimmt.

Der Typ des direkten Austauschs ist nützlich, um Nachrichten zu unterscheiden, die an denselben Austausch mit einem einfachen String-Identifikator veröffentlicht werden.

Der Standardaustausch, den AMQP-Broker für den direkten Austausch bereitstellen müssen, ist „amq.direct“.

Stellen Sie sich vor, dass die Warteschlange A (create_pdf_queue) in der Abbildung unten (Abbildung des direkten Austauschs) an einen direkten Austausch (pdf_events) mit dem Bindungsschlüssel „pdf_create“ gebunden ist.Wenn eine neue Nachricht mit dem Routing-Schlüssel „pdf_create“ beim direkten Austausch eintrifft, leitet der Austausch sie an die Warteschlange weiter, bei der „binding_key“ = „routing_key“ ist, in diesem Fall an Warteschlange A (create_pdf_queue).

Szenario 1

  • Austausch: pdf_events
  • Warteschlange A: create_pdf_queue
  • Bindungsschlüssel zwischen Austausch (pdf_events) und Warteschlange A (create_pdf_queue): pdf_create

Szenario 2

  • Austausch: pdf_events
  • Warteschlange B: pdf_log_queue
  • Bindungsschlüssel zwischen Austausch (pdf_events) und Warteschlange B (pdf_log_queue): pdf_log

Beispiel

Beispiel: Eine Nachricht mit dem Routing-Schlüsselypdf_log wird an den Exchangepdf_events gesendet.Die Nachricht wird an die pdf_log_queue weitergeleitet, weil der Routing-Schlüssel (pdf_log) mit demBindungsschlüssel (pdf_log) übereinstimmt.

Wenn der Routing-Schlüssel der Nachricht mit keinem Bindungsschlüssel übereinstimmt, wird die Nachricht verworfen.

Direkter Austausch: Eine Nachricht geht an die Warteschlangen, deren Bindungsschlüssel genau mit dem Routing-Schlüssel der Nachricht übereinstimmt.

Standardaustausch

Der Standardaustausch ist ein vordeklarierter direkter Austausch ohne Namen, der normalerweise durch eine leere Zeichenfolge bezeichnet wird. Wenn Sie den Standardaustausch verwenden, wird Ihre Nachricht an die Warteschlange mit einem Namen geliefert, der dem Routing-Schlüssel der Nachricht entspricht. Jede Warteschlange ist automatisch an den Standardaustausch mit einem Routing-Schlüssel gebunden, der mit dem Namen der Warteschlange übereinstimmt.

Topic Exchange

Topic exchanges leiten Nachrichten an Warteschlangen weiter, die auf Platzhalterübereinstimmungen zwischen dem Routing-Schlüssel und dem Routing-Muster basieren, das durch die Warteschlangenbindung angegeben ist. Nachrichten werden an eine oder mehrere Warteschlangen weitergeleitet, basierend auf einer Übereinstimmung zwischen einem Nachrichten-Routing-Schlüssel und diesem Muster.

Der Routing-Schlüssel muss eine Liste von Wörtern sein, die durch einen Punkt (.) getrennt sind. Beispiele sind Vereinbarungen.usundVereinbarungen.eu.stockholm, die in diesem Fall Vereinbarungen identifizieren, die für ein Unternehmen mit Niederlassungen an vielen verschiedenen Standorten erstellt werden. Die Routing-Muster können ein Sternchen („*“) enthalten, um ein Wort an einer bestimmten Position des Routing-Schlüssels zu finden (z. B. ein Routing-Muster „agreements.*.*.b.*“ findet nur Routing-Schlüssel, bei denen das erste Wort „agreements“ und das vierte Wort „b“ ist). Ein Pfund-Symbol („#“) zeigt eine Übereinstimmung mit null oder mehr Wörtern an (z.B. ein Routing-Muster von „agreements.eu.berlin.#“ passt zu allen Routing-Schlüsseln, die mit „agreements.eu.berlin“ beginnen).

Die Verbraucher geben an, an welchen Themen sie interessiert sind (wie das Abonnieren eines Feeds für einen einzelnen Tag). Der Verbraucher erstellt eine Warteschlange und richtet eine Verbindung mit einem bestimmten Routing-Muster zum Austausch ein. Alle Nachrichten mit einem Routing-Schlüssel, die mit dem Routing-Muster übereinstimmen, werden in die Warteschlange geleitet und bleiben dort, bis der Verbraucher die Nachricht konsumiert.

Der Standardaustausch, den AMQP-Broker für den Topic-Austausch bereitstellen müssen, ist „amq.topic“.

Szenario 1

Das Bild auf der rechten Seite zeigt ein Beispiel, bei dem Konsument A an allen Vereinbarungen in Berlin interessiert ist.

  • Exchange: agreements
  • Queue A: berlin_agreements
  • Routingmuster zwischen Exchange (agreements) und Queue A (berlin_agreements): agreements.eu.berlin.#
  • Beispiel für einen Routing-Schlüssel, der passt: agreements.eu.berlin und agreements.eu.berlin.headstore

Szenario 2

Kunde B ist an allen Vereinbarungen interessiert.

  • Börse: Vereinbarungen
  • Warteschlange B: alle_Vereinbarungen
  • Routingmuster zwischen Börse (Vereinbarungen) und Warteschlange B (alle_Vereinbarungen): Vereinbarungen.#
  • Beispiel für Nachrichten-Routing-Schlüssel, der passt: agreements.eu.berlin und agreements.us

Topic Exchange: Nachrichten werden auf der Grundlage einer Übereinstimmung zwischen einem Nachrichten-Routing-Schlüssel und dem Routing-Muster an eine oder mehrere Warteschlangen weitergeleitet.

Szenario 3

Kunde C ist an allen Vereinbarungen für europäische Hauptlager interessiert.

  • Austausch: Vereinbarungen
  • Warteschlange C: headstore_agreements
  • Routingmuster zwischen Austausch (Vereinbarungen) und Warteschlange C (headstore_agreements): Vereinbarungen.eu.*.headstore
  • Beispiel für übereinstimmende Routing-Schlüssel von Nachrichten: agreements.eu.berlin.headstore und agreements.eu.stockholm.headstore

Beispiel

Eine Nachricht mit Routing-Schlüsselagreements.Die Nachricht wird an die Warteschlange „berlin_agreements“ weitergeleitet, da das Routing-Muster „agreements.eu.berlin.#“ mit den Routing-Schlüsseln, die mit „agreements.eu.berlin“ beginnen, übereinstimmt. Die Nachricht wird auch an die Warteschlange all_agreements weitergeleitet, da der Routing-Schlüssel (agreements.eu.berlin) mit dem Routing-Muster (agreements.#) übereinstimmt.

Fanout-Austausch

Ein Fanout-Austausch kopiert eine empfangene Nachricht und leitet sie an alle Warteschlangen weiter, die an ihn gebunden sind, unabhängig von den Routing-Schlüsseln oder der Musterübereinstimmung, wie bei direktem und Topic-Austausch. Die angegebenen Schlüssel werden einfach ignoriert.

Fanout-Austausche können nützlich sein, wenn dieselbe Nachricht an eine oder mehrere Warteschlangen mit Verbrauchern gesendet werden muss, die dieselbe Nachricht auf unterschiedliche Weise verarbeiten können.

Das Bild auf der rechten Seite (Fanout-Austausch) zeigt ein Beispiel, bei dem eine vom Austausch empfangene Nachricht kopiert und an alle drei an den Austausch gebundenen Warteschlangen weitergeleitet wird. Es könnte sich beispielsweise um Sport- oder Wetter-Updates handeln, die an jedes verbundene mobile Gerät gesendet werden sollen, wenn etwas passiert.

Der Standard-Exchange, den AMQP-Broker für den Topic-Exchange bereitstellen müssen, ist „amq.fanout“.

Fanout Exchange: Die empfangene Nachricht wird an alle Warteschlangen weitergeleitet, die an den Austausch gebunden sind.

Szenario 1

  • Austausch: sport_news
  • Warteschlange A: Mobile Client-Warteschlange A
  • Bindung: Bindung zwischen der Vermittlungsstelle (sport_news) und Warteschlange A (Mobile Client-Warteschlange A)

Beispiel

Eine Nachricht wird an die Vermittlungsstelle sport_news gesendet. Die Nachricht wird an alle Warteschlangen (Warteschlange A, Warteschlange B, Warteschlange C) weitergeleitet, da alle Warteschlangen an die Vermittlungsstelle gebunden sind. Vorgegebene Routing-Schlüssel werden ignoriert.

Headers Exchange

Ein Headers Exchange leitet Nachrichten auf der Grundlage von Argumenten weiter, die Header und optionale Werte enthalten. Header-Austausche sind den Topic-Austauschen sehr ähnlich, leiten aber Nachrichten auf der Grundlage von Header-Werten anstelle von Routing-Schlüsseln weiter. Eine Nachricht stimmt überein, wenn der Wert des Headers mit dem bei der Bindung angegebenen Wert übereinstimmt.

Ein spezielles Argument namens „x-match“, das in der Bindung zwischen Austausch und Warteschlange hinzugefügt wird, gibt an, ob alle Header übereinstimmen müssen oder nur einer. Entweder zählt jeder gemeinsame Header zwischen der Nachricht und der Bindung als Übereinstimmung, oder alle Header, auf die in der Bindung verwiesen wird, müssen in der Nachricht vorhanden sein, damit sie übereinstimmt. Die Eigenschaft „x-match“ kann zwei verschiedene Werte haben: „any“ oder „all“, wobei „all“ der Standardwert ist. Ein Wert von „all“ bedeutet, dass alle Kopfzeilenpaare (Schlüssel, Wert) übereinstimmen müssen, während ein Wert von „any“ bedeutet, dass mindestens eines der Kopfzeilenpaare übereinstimmen muss. Kopfzeilen können unter Verwendung eines breiteren Spektrums von Datentypen, z. B. Integer oder Hash, anstelle einer Zeichenkette erstellt werden. Der Header-Austausch-Typ (verwendet mit dem Bindungsargument „any“) ist nützlich, um Nachrichten zu leiten, die eine Teilmenge bekannter (ungeordneter) Kriterien enthalten.

Der Standard-Austausch, den AMQP-Broker für den Topic-Austausch bereitstellen müssen, ist „amq.headers“.

Beispiel

Szenario 3

Nachricht 3 wird an den Austausch mit Header-Argumenten von (Schlüssel = Wert) veröffentlicht: „format = zip“, „type = log“.

Es ist erwähnenswert, dass bei einem Header-Austausch die tatsächliche Reihenfolge der Schlüssel-Wert-Paare in der Nachricht irrelevant ist.

Dead Letter Exchange

Wenn keine passende Warteschlange für die Nachricht gefunden werden kann, wird die Nachricht stillschweigend verworfen. RabbitMQ stellt eine AMQP-Erweiterung zur Verfügung, die als „Dead Letter Exchange“ bekannt ist und die Funktionalität bietet, um Nachrichten zu erfassen, die nicht zustellbar sind.

Bitte senden Sie uns eine E-Mail an [email protected], wenn Sie Vorschläge zu fehlenden Inhalten oder anderes Feedback haben.

Leitfaden – RabbitMQ für Anfänger

Gefiel Ihnen dieser Artikel? Vergessen Sie nicht, ihn mit anderen zu teilen 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.