RabbitMQ ist ein hervorragendes Open-Source-Projekt, mit dem Sie Hunderttausende von Nachrichten pro Sekunde schnell und effizient an Ihre Anwendung übermitteln können. Der folgende Eintrag zeigt, wie Sie einen RabbitMQ-Cluster mit drei separaten Hosts platzieren können. Zu diesem Zweck verwenden wir Docker und stellen mithilfe von Node eine Verbindung zum fertigen Cluster her.js.

Über RabbitMQ

RabbitMQ ist ein Warteschlangensystem, das auf dem AMQP-Protokoll basiert. Dank der Verwendung dieser Sprache eignet sich RabbitMQ ideal für den Einsatz als zentraler Datenbus in der Microservice-Architektur. Eine solche Schiene bietet ein großartiges Substrat für Anwendungen, die einen großen dynamischen Entwicklungsbereich im DDD- und CQRS-Paradigma ermöglichen. Da der Datenbus (Warteschlange von Nachrichten) das Rückgrat der Architektur ist, ist es wichtig, dass er immer verfügbar und ausfallsicher ist. Redundante Architektur wird die natürliche Wahl, dh Replikation von Daten in separate Executive-Knoten.

Die Replikation in RabbitMQ wird nativ im Master-Slave-Modus unterstützt. Dies bedeutet, dass RabbitMQ immer einen Knoten für jede erstellte Warteschlange auswählt und alle Nachrichten zum Speichern an ihn umleitet sowie Nachrichten zum Lesen aus der Warteschlange abruft. Obwohl die Replikation am sinnvollsten ist, wenn Knoten auf verschiedenen physischen Computern verteilt sind, werde ich in diesem Fall ein Beispiel für die Replikation innerhalb desselben Computers verwenden. RabbitMQ wird aufgrund seines Zwecks, dh Hunderttausender unterstützter Nachrichten pro Sekunde, im Replikationsmodus auf Computern, die sich nicht im selben Serverrack befinden, nicht bevorzugt. Dies liegt an der Tatsache, dass Nachrichten in der Warteschlange sehr kurz bleiben und die Annahmen nicht über RAM hinausgehen sollten, replizieren sie basierend auf einer Netzwerkverbindung in einem anderen Teil des Rechenzentrums oder zu einem völlig anderen Rechenzentrum würde drastische Leistungseinbußen bedeuten, und in dieser Systemklasse kann nicht gewährt werden. Indem wir RabbitMQ-Knoten nahe beieinander platzieren, minimieren wir außerdem das Risiko einer sogenannten Netzwerkpartition (was bei einem Cluster sehr unwahrscheinlich ist), d. H. Das Phänomen, die Kommunikation zwischen Knoten so zu unterbrechen, dass sich mindestens 2 Knoten aus dem gesamten Cluster als Master betrachten. Mehr über die Netzwerkpartition im Kontext von RabbitMQ erfahren Sie hier.

Daher versetzt die praxisbasierte Regel RabbitMQ nur im selben Rechenzentrum in den Replikationsmodus.

Herunterladen von Docker-Images

Ich gehe davon aus, dass Sie wissen, was Docker ist und wie es verwendet wird, da wir es im nächsten Teil des Eintrags verwenden werden.

Laden Sie zunächst die entsprechenden RabbitMQ-Images (zusammen mit dem Admin-Panel-Plugin) und den Knoten herunter.js, zu diesem Zweck verwenden wir die folgenden Befehle:

docker pull 3.6.6-managementdocker pull node:11.10.1

Setup RabbitMQ hosts

Für die Zwecke der Präsentation werden wir einen starten RabbitMQ Bild zu dem wir uns mit dem Befehl docker exec verbinden und die Bash-Shell aufrufen, um die Konfiguration auf unsere Weise ausführen zu können. Verwenden wir den Befehl:

docker run --hostname rabbit --name rabbit --rm -ti --net="host" rabbitmq:3.6.6-management /bin/bash

Mit dem obigen Befehl wird das Image von RabbitMQ ausgeführt, das nach dem Verlassen der Shell gelöscht wird. Die Instanz wird mit unserer Netzwerkschnittstelle verbunden, sodass wir uns nicht um die Portweiterleitung kümmern müssen. Wenn die Shell [email protected]:/# unseren Augen erschien, bedeutet dies, dass alles gut gelaufen ist.

Der nächste Schritt besteht darin, drei RabbitMQ-Prozesse auf separaten Ports auszuführen.

RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=rabbit rabbitmq-server -detachedRABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=hare rabbitmq-server -detachedRABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=john rabbitmq-server -detached

Als nächstes befestigen wir mit Hilfe des rabbitmqctlbeide Knoten mit dem Namen rabbit an der Wurzel:

rabbitmqctl -n hare stop_apprabbitmqctl -n hare join_cluster [email protected]`hostname -s`rabbitmqctl -n hare start_apprabbitmqctl -n john stop_apprabbitmqctl -n john join_cluster [email protected]`hostname -s`rabbitmqctl -n john start_app

Schließlich können wir den Browser öffnen und die Adresse eingeben http://localhost:15672 Um zu überprüfen, ob alles gut gelaufen ist, sollte die Cluster-Verwaltungskonsole wie auf dem Bildschirm unten auf alle Knoten zeigen.

Wichtig. Deaktivieren Sie die Container-Shell nicht in RabbitMQ, da sie dadurch entfernt wird (die Option –rm im Docker-Startbefehl)

Wir haben das Letzte zu tun, obwohl der RabbitMQ-Cluster bereit ist, müssen wir die entsprechenden Richtlinien konfigurieren. Weitere Informationen zur Hochverfügbarkeit (HA) in RabbitMQ finden Sie in der Dokumentation.

Oben finden Sie ein Beispiel für die Konfiguration der HA-Richtlinie. Und unten ist die Überprüfungsmethode. Die Zahl +2 am Knotennamen bedeutet die Anzahl der separaten Hosts, auf die die Warteschlange repliziert wird.

Installation und Download der amqp-Bibliothek am Knoten.js

Der nächste Schritt besteht darin, die Docker-Containerinstanz mit dem Knoten zu starten.js Bild, zu diesem Zweck führen Sie den folgenden Befehl, der auch die Netzwerkschnittstelle teilt.

docker run -ti --rm --net="host" node:11.10.1 /bin/bash

Dann erstellen wir an der von unserer Site ausgewählten Stelle (z. B. /home) ein Verzeichnis, in das wir die erforderlichen Skripte einfügen und die amqp-connection-Manager-Bibliothek installieren, die die Verbindung zu RabbitMQ (oder einem anderen System, das das AMQP-Protokoll implementiert) von der Ebene des Knotens aus ermöglicht.js.

npm install --save amqp-connection-manager

Darüber hinaus ermöglicht die Bibliothek das Hinzufügen mehrerer RabbitMQ-Hostadressen und bietet einen Mechanismus zum erneuten Herstellen der Verbindung im Falle eines Ausfalls eines Hosts. Dies ist eine sehr nützliche Funktionalität, da sie für eine ordnungsgemäße Verbindung mit RabbitMQ sorgt und im Fehlerfall Nachrichten im Speicher erkennen kann, bis die Verbindung wieder hergestellt wird.

Beispiel Hersteller-Verbraucher-Code

Nachdem wir alle Komponenten vorbereitet haben, können wir mit der Erstellung eines einfachen Codes beginnen, der für das Erstellen und Empfangen von Nachrichten verantwortlich ist. Zu diesem Zweck erstellen wir zwei Dateien und füllen sie mit einem Code.

Hersteller.js – Das Skript stellt eine Verbindung zur RabbitMQ-Instanz her und sendet 10 Nachrichten pro Sekunde.

let q = 'tasks';let amqp = require('amqp-connection-manager');function sleep(ms) { if(ms setTimeout(resolve, ms));}let main = async () => { var connection = amqp.connect(); var channelWrapper = connection.createChannel({ json: true, setup: function(channel) { return channel.assertQueue(q, { durable: true }); } }); console.log('Starting message stream') while (true) { await channelWrapper.sendToQueue(q, { value: Math.random() }) await sleep(100) }}main()

Verbraucher.js – Das Skript stellt eine Verbindung zur RabbitMQ-Instanz her und liest Nachrichten aus der Warteschlange.

let q = 'tasks';let amqp = require('amqp-connection-manager');let main = async () => { var connection = amqp.connect(); var channelWrapper = connection.createChannel({ json: true, setup: function(channel) { return channel.assertQueue(q, { durable: true }); } }); channelWrapper.addSetup(function(channel) { return Promise.all() });}main()

Dateien, die auf diese Weise erstellt wurden, können separat mit Node ausgeführt werden.js und beobachten Sie, wie consumer.js Daten von producer.js empfängt. Um den Replikationsvorgang im RabbitMQ-Cluster zu überprüfen, empfehlen wir Ihnen, während des Datenaustauschs durch Skripte einen der RabbitMQ-Prozesse zu deaktivieren, um zu sehen, wie der Fehler behandelt wird und wie RabbitMQ den neuen Master auswählt und die Nachrichten entsprechend umleitet.

rabbitmqctl -n john stop_app

Das Deaktivieren einer der RabbitMQ-Instanzen wirkt sich nicht auf die Erstellung oder das Herunterladen von Nachrichten aus. Warteschlangen werden automatisch repliziert und die Verbindung wiederhergestellt, ohne dass eigene Mechanismen implementiert werden müssen.

Zusammenfassend ist RabbitMQ ein großartiges Warteschlangensystem, das nach einer ordnungsgemäßen Konfiguration eine hohe Verfügbarkeit gewährleistet, die nicht viele Probleme verursacht. Eine große Anzahl von Bibliotheken in vielen Sprachen, zB Knoten.js, PHP, Java, Python, Golang, C / C ++, ermöglicht eine einfache Implementierung des Systems im Projekt. Ich empfehle jedem, die Dokumentation zu lesen, in der die Probleme im Zusammenhang mit dem Betrieb des Systems und seiner korrekten Konfiguration, die sehr umfangreich ist, sehr klar erläutert werden.

Der gesamte Code wird im Repository auf Github gespeichert

Ähnliche Suchen: nodejs rabbitmq / nodejs queue / rabbitmq queue nodejs