Eine Einführung in RabbitMQ, einen Broker, der sich mit Nachrichten befasst

Eine Einführung in RabbitMQ, Message Broker, AMQP-Modell und mehr.

In verteilten Systemen spielt die Kommunikation zwischen verschiedenen Anwendungen eine wichtige Rolle. Das effektive Weiterleiten von Nachrichten zwischen Anwendungen war immer eine entscheidende Entscheidung beim Systemdesign. Eine der eleganten Lösungen zum Weiterleiten von Nachrichten an Ihr verteiltes System ist ein Nachrichtenbroker.

In verteilten Systemen spielt die Kommunikation zwischen verschiedenen Anwendungen eine wichtige Rolle. Das effektive Weiterleiten von Nachrichten zwischen Anwendungen war immer eine entscheidende Entscheidung beim Systemdesign. Eine der eleganten Lösungen zum Weiterleiten von Nachrichten an Ihr verteiltes System ist ein Nachrichtenbroker.

Sie bewirken eine Entkopplung zwischen den Anwendungen und bieten eine effektive Möglichkeit zur Kommunikation. Bei Nachrichtenbrokern benötigt eine Anwendung keine Vorkenntnisse ihrer Empfänger, um kommunizieren zu können.

Was ist RabbtiMQ? Wie passt RabbitMQ in dieses Bild? Was ist AMQP?

Am Ende dieses Artikels können wir diese Fragen beantworten. Ich habe auch einige Animationen hinzugefügt, damit Sie RabbitMQ-Konzepte visualisieren können.

Also bist du aufgeregt? Ich bin! Wenn Sie jemals Schwierigkeiten hatten, Nachrichtenbroker zu verstehen, wie ich, dann ist dieser Artikel der richtige Ort, um Ihre Reise zu beginnen. Bleib bei mir ?

Nachrichtenbroker

Im Allgemeinen ist ein Broker eine Person, die den Handel zwischen einem Käufer und einem Verkäufer erleichtert. Ein Beispiel könnte ein Immobilienmakler oder ein Börsenmakler sein.

Wenn wir Nachrichten zwischen zwei verteilten Softwarekomponenten austauschen möchten, benötigen wir einen Mediator. Dieser Mediator wird als Nachrichtenbroker bezeichnet. Es empfängt eingehende Nachrichten von einem Absender und sendet sie an einen Empfänger. Auf diese Weise können Sender und Empfänger vollständig isoliert werden.

Eine andere Analogie für einen Nachrichtenbroker kann ein Postamt sein (siehe Abbildung 1). Nehmen wir ein Szenario, in dem Sie Ihrem Cousin, der in einer anderen Stadt lebt, einen Brief schicken. Dann sind Sie nach dieser Analogie ein Produzent, Ihr Cousin ein Verbraucher und die Post ein Nachrichtenvermittler.

RabbitMQ als Nachrichtenbroker

Jetzt wissen wir, dass der Zweck eines Nachrichtenbrokers darin besteht, Nachrichten von einem Produzenten an einen Verbraucher weiterzuleiten. Lassen Sie uns einen solchen Nachrichtenbroker untersuchen - RabbitMQ. Es ist heutzutage einer der am häufigsten genutzten Nachrichtenbroker.

Die Art und Weise, wie RabbitMQ Nachrichten weiterleitet, hängt vom implementierten Messaging-Protokoll ab. RabbitMQ unterstützt mehrere Messaging-Protokolle. Das, was uns interessiert, ist jedoch AMQP. Es ist eine Abkürzung für Advanced Message Queuing Protocol.

Schauen wir uns also ohne weiteres das AMQP-Protokollmodell genauer an.

Erweitertes Message Queuing-Protokoll

Das konzeptionelle Modell von AMQP ist recht einfach und unkompliziert. Es hat drei Einheiten:

  1. Warteschlange
  2. Bindung
  3. Austausch

Wenn ein Publisher eine Nachricht an RabbitMQ sendet, kommt sie zuerst zu einem Austausch. Der Austausch verteilt dann Kopien dieser Nachrichten an unterschiedlich verbundene Warteschlangen. Schließlich erhalten die Verbraucher diese Nachrichten.

Betrachten Sie eine Nachricht als Datenelement. Es ist notwendigerweise ein Paket mit einer Nutzlast und einigen Metadaten. Die Nutzdaten enthalten vollständige Daten, während Metadaten Eigenschaften sind, die von RabbitMQ verwendet werden.

Abbildung 2 zeigt eine grafische Darstellung des AMQP-Modells.

AMQP ist ein programmierbares Protokoll. Programmierer haben die Freiheit, Bibliotheken zu verwenden, um Entitäten (Austausch, Bindung und Warteschlange) gemäß ihren eigenen Anforderungen zu konfigurieren. Ein RabbitMQ-Administrator spielt beim Einrichten dieser Entitäten keine Rolle.

Für die Arbeit mit RabbitMQ stehen zahlreiche Bibliotheken zur Verfügung. Sie können zwischen Nodejs, Python, .Net, Java und vielen mehr wählen.

Warteschlangen

Diese Warteschlangen ähneln in gewisser Weise den Warteschlangen aus unseren Datenstrukturklassen. RabbitMQ-Warteschlangen folgen ebenfalls der FIFO-First-In-First-Out-Methode. Eine Warteschlange ist ein Ort, an dem RabbitMQ Nachrichten / Daten speichert.

Programmierer können Warteschlangen über verfügbare Programmierbibliotheken konfigurieren. Sie können eine Warteschlange (mit der DurabilityEigenschaft) dauerhaft machen , um Ihre Daten bei einem Absturz des Brokers zu schützen. Sie können Nameeiner Warteschlange auch einen Namen (mit der Eigenschaft) geben. Abgesehen von Nameund Durabilityverfügt eine Warteschlange über einige andere Eigenschaften wie automatisches Löschen, Exklusiv und Argumente.

Bevor Sie fortfahren, ist es wichtig zu verstehen, wer ein direkter Verbraucher dieser Warteschlangen ist. Wie viele Möglichkeiten kann ein Benutzer außerdem, Nachrichten aus einer Warteschlange zu konsumieren?

Verbraucher

Verbraucher sind diejenigen, die in einer Warteschlange gespeicherte Nachrichten verwenden. Es ist möglich, mehrere Verbraucher gleichzeitig mit einer Warteschlange zu verbinden. Verbraucher können die Nachricht entweder aus der Warteschlange ziehen, indem sie sie zusammenfassen, oder Warteschlangen können die Nachricht sogar an verschiedene Verbindungsverbraucher senden.

Bindungen

Bindungen sind die Regeln, die eine Warteschlange beim Herstellen einer Verbindung mit einer Vermittlungsstelle definiert. Sie können eine Warteschlange mit mehreren Vermittlungsstellen verbinden. Jede Warteschlange ist auch mit einem Standardaustausch verbunden. Ein Austausch verwendet diese Bindungen, um Nachrichten an Warteschlangen weiterzuleiten.

Börsen und ihre Arten

Ein Exchange ist ein Gateway zu RabbitMQ für Ihre Nachrichten. Die Entfernung, die die Nachricht innerhalb von RabbitMQ zurücklegen muss, hängt von der Art des Austauschs ab. In erster Linie gibt es vier Arten.

  • Direkte
  • Ausschwärmen
  • Thema
  • Header

Direkte

Der Name erklärt alles! - Ein direkter Austausch sendet eine Nachricht direkt an die Warteschlangen, die die folgende Bedingung erfüllen:

Routing key == Binding key 

Ein Routing-Schlüssel ist ein Attribut der Nachricht. Auf der anderen Seite geben Sie einen Bindungsschlüssel an, während Sie eine Bindung zwischen einer Warteschlange und einem Austausch erstellen.

Abbildung 3 ist eine visuelle Erklärung des Nachrichtenflusses bei Verwendung eines direkten Austauschs.

Eine Nachricht stammt von einem Produzenten (grüner Kreis) mit einem Routing-Schlüssel - img.resize. Sobald die Vermittlungsstelle erreicht ist (orangefarbener Kreis), versucht die Vermittlungsstelle, alle Warteschlangen mit dem Bindungsschlüssel - zu finden img.resize. Im Falle einer Übereinstimmung wird die Nachricht an alle übereinstimmenden Warteschlangen gesendet (in unserem Fall die Größe ändern). Wenn keine Übereinstimmung gefunden wird, kann die Nachricht an den Produzenten zurückgesendet oder sogar verworfen werden. Wir haben Glück, dass wir in unserem Beispiel eine Übereinstimmung gefunden haben?

[GIF-Bild]

Sobald die Nachricht die gewünschte Warteschlange erreicht hat (in unserem Fall die Größe ändern), werden sie im Round-Robin-Verfahren an alle verbundenen Verbraucher verteilt (in unserem Fall resizer.1 / resizer.2).

Durch die Round-Robin-Verteilung von Nachrichten stellt RabbitMQ sicher, dass die Nachrichten einen Lastausgleich aufweisen.

Sie müssen bemerkt haben, dass die Warteschlange mit dem Namen crop keine Nachrichten empfängt. Weil der Routing-Schlüssel in diesem Beispiel ist img.resize. Um Nachrichten an diese Warteschlange zu senden, müssen wir Nachrichten mit einem Routing-Schlüssel senden, der mit dem Bindungsschlüssel übereinstimmt ( img.crop z. B.).

Ausschwärmen

Ein Fanout-Austausch ignoriert Routing-Schlüssel und verteilt eine Nachricht an alle verbundenen Warteschlangen. Kein Wunder, dass es Fanout heißt (Nachrichten an alle verbundenen Warteschlangen senden !?).

Einer der Anwendungsfälle für diese Art des Austauschs ist die Nachrichtenübertragung.

Bitte beachten Sie, dass RabbitMQ weiterhin Round Robin ausführt, wenn sich mehr als ein Verbraucher in der Warteschlange befindet.

Thema

Ein Themenaustausch leitet eine Nachricht weiter, indem der Routing-Schlüssel mit einem Muster im Bindungsschlüssel abgeglichen wird.

Routing key == Pattern in binding key.

RabbitMQ verwendet zwei Platzhalterzeichen für den Mustervergleich *und #. Verwenden Sie a *, um 1 Wort zuzuordnen, und a #, um 0 oder mehr Wörter abzugleichen.

5 ist eine visuelle Darstellung eines Themenaustauschs. Nachrichten mit Routing-Schlüssel - logs.errorstimmen mit Mustern überein - logs.errorund logs.*. Daher landen diese Nachrichten in den Warteschlangen - only error und all logs.

Während für den Produzenten unten links Nachrichten mit Routing-Schlüssel - logs.successmit den Mustern des Bindungsschlüssels #success und übereinstimmen logs.*. Daher landen diese Nachrichten in den Warteschlangen - all logsund only success.

[gif]

Diese Art des Austauschs hat eine Vielzahl von Anwendungsfällen. Es kann im Publish-Subscribe-Muster verwendet werden, um relevante Daten an die gewünschten Mitarbeiterprozesse und vieles mehr zu verteilen.

Header

Ein Header ist eine bestimmte Art des Austauschs, bei dem Nachrichten basierend auf den im Nachrichtenkopf vorhandenen Schlüsseln weitergeleitet werden. Es übersieht das Routing-Schlüsselattribut der Nachricht.

Beim Erstellen von Bindungen für einen Header-Austausch ist es möglich, eine Warteschlange so zu binden, dass sie mit mehr als einem Header übereinstimmt. In einem solchen Fall sollte RabbitMQ vom Hersteller wissen, ob alle oder einige dieser Schlüssel übereinstimmen sollten.

Ein Produzent / eine Anwendung kann dies tun, indem er ein zusätzliches Flag namens "x-match" bereitstellt. 'x-match' kann anyoder allWerte haben. Der erste schreibt vor, dass nur ein Wert übereinstimmen soll, während der zweite vorschreibt, dass alle übereinstimmen müssen.

Nachrichtenbestätigung

Sobald eine Nachricht ihr Ziel erreicht hat, sollte der Broker die Nachricht aus der Warteschlange löschen. Dies ist erforderlich, da ein Warteschlangenüberlauf auftreten kann, wenn weiterhin Nachrichten gesammelt werden.

Vor dem Löschen einer Nachricht muss der Broker über eine Zustellbestätigung verfügen. Es gibt zwei Möglichkeiten, die Nachrichtenübermittlung zu bestätigen.

  1. Automatische Bestätigung: Sobald ein Verbraucher die Nachricht erhält
  2. Explizite Bestätigung: Wenn ein Verbraucher eine Bestätigung zurücksendet

In den meisten Fällen wird eine explizite Bestätigung verwendet, um sicherzustellen, dass der Verbraucher die Nachricht ohne Failover konsumiert hat.

Was kommt als nächstes

RabbitMQ ist ein sehr ausgereiftes und nützliches Produkt. Dieser Artikel ist nur eine allgemeine Einführung in RabbitMQ. Ich habe die Konzepte vereinfacht, um Ihnen einen Bezugspunkt zu bieten, an dem Sie sich weiterentwickeln können. Besuchen Sie die RabbitMQ-Website für komplexere Themen.

Hoffe dir gefällt der Artikel. Vergiss nicht zu klatschen (oder zu applaudieren?). Folgen Sie, um meine kommenden Geschichten zu lesen. Bis zum nächsten Mal in der Warteschlange bleiben.