Verwenden von RabbitMQ mit MonsterMQ Teil 1

Dieser Artikel richtet sich an Personen, die mit Warteschlangen und RabbitMQ noch nicht vertraut sind. Wenn Sie bereits wissen, wie man mit RabbitMQ arbeitet, und nur die Möglichkeiten von MonsterMQ erkunden möchten, empfehlen wir Ihnen, die Projektseite auf github.com zu besuchen. In der Beschreibung wird ausführlich beschrieben, wie Sie MonsterMQ verwenden können, ohne die Grundlagen der Arbeit mit RabbitMQ zu beschreiben. Der Rest dieses Artikels behandelt die Grundlagen der Funktionsweise von RabbitMQ mit MonsterMQ.

RabbitMQ ist ein Nachrichtenbroker. Es empfängt, speichert und leitet Nachrichten an seine Kunden weiter. Absender und Empfänger von Nachrichten von Clients können beispielsweise in PHP geschriebene Anwendungen bedienen. Die Kommunikation zwischen dem Client und RabbitMQ erfolgt nach bestimmten Regeln, die als AMQP (Advanced Message Queuing Protocol) bezeichnet werden. Beispielsweise folgt die Kommunikation zwischen Ihrem Browser und dem Webserver, auf dem sich dieser Artikel befindet, bestimmten Regeln. Sie werden als HTTP (HyperText Transfer Protocol) bezeichnet - ein Hypertext-Übertragungsprotokoll. Sowohl HTTP als auch AMQP sind Client-Server-Protokolle, dh sie implizieren die Anwesenheit eines Clients und eines Servers. RabbitMQ ist ein AMQP-Server, und MonsterMQ ist eine Bibliothek, mit der Sie schnell einen AMQP-Client in PHP schreiben können, der mit dem AMQP-Server kommuniziert.

AMQP und RabbitMQ verwenden die folgenden Begriffe:

Produzieren - bedeutet, Nachrichten zu senden, Produzent (Lieferant) - derjenige, der Nachrichten sendet.

Bild

Konsumieren - bedeutet, Nachrichten zu empfangen. Verbraucher - derjenige, der Nachrichten empfängt.

Bild

Warteschlange ist die Warteschlange. Vor dem Erreichen des Verbrauchers und nach dem Senden durch den Lieferanten wird die Nachricht in einer Warteschlange in RabbitMQ gespeichert. Die Warteschlange ist ein Puffer, in dem Nachrichten gespeichert werden. Viele Anbieter können Nachrichten in einer Warteschlange senden, und viele Verbraucher können Nachrichten aus einer Warteschlange lesen.

Bild

Beachten Sie, dass sich Anbieter, Verbraucher und Broker nicht auf demselben Host befinden müssen, sondern sich normalerweise auf einem anderen Host befinden.

Hallo Welt


Später in diesem Artikel werden wir zwei Programme in PHP unter Verwendung der MonsterMQ-Bibliothek schreiben, von denen eines Nachrichten sendet und das andere sie empfängt und an die Konsole ausgibt. In der folgenden Abbildung ist "P" der Anbieter, "C" der Verbraucher, rote Kästchen die Warteschlange, die den Nachrichtenpuffer darstellt (jedes Kästchen ist die Nachricht).

Bild
(Bild von der offiziellen RabbitMQ-Website )

Für weitere Arbeiten müssen wir MonsterMQ installieren. Geben Sie dazu den folgenden Befehl in die Konsole ein:

composer require goootlib/monster-mq:dev-master

(Weitere Informationen zur Installation von MonsterMQ finden Sie auf der Projektseite auf github.com.) Mit
diesem Befehl wird MonsterMQ im aktuellen Ordner installiert.

Abfahrt


Wir werden unseren Absender send.php anrufen und den Empfänger receive.php . Der Absender tritt dem Server bei und sendet die Nachricht.
Um dem Server beizutreten, schreiben Sie den folgenden Code in send.php :.

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');
} catch(\Exception $e) {
   var_dump($e);
}

In diesem Code verbinden wir RabbitMQ, das auf einem lokalen Server an einem Standardport ausgeführt wird. Geben Sie eine andere IP-Adresse und einen anderen Port an, wenn RabbitMQ auf Ihrer anderen Adresse ausgeführt wird. Nach der Verbindung rufen wir auch die Methode logIn () auf, die die Sitzung mit dem Standard-Login und -Kennwort startet. Wenn Sie ein Konto mit einem anderen Benutzernamen und Kennwort in RabbitMQ konfiguriert haben, geben Sie diese hier an.

Um eine Nachricht zu senden, müssen wir die Warteschlange deklarieren, in die sie zuerst gestellt wird. Nachdem die Warteschlange angekündigt wurde, können wir eine Nachricht senden:

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');

   $producer->queue('test-queue')->declare();
   $producer->publish('my-message', 'test-queue');
} catch(\Exception $e) {
   var_dump($e);
}

Die Warteschlangendeklaration ist idempotent, dh sie erstellt die Warteschlange nicht und ändert sie nicht, wenn sie bereits vorhanden ist. Nachdem wir die Sitzung abgeschlossen haben und beitreten.

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');

   $producer->queue('test-queue')->declare();
   $producer->publish('Test message', 'test-queue');

   $producer->disconnect();
} catch(\Exception $e) {
   var_dump($e);
}

Erhalte Nachricht


Im Gegensatz zum Absender bleibt der Empfänger weiterhin aktiv, um eingehende Nachrichten abzuhören. Im Receive.php- Code müssen Sie zuerst dasselbe tun wie in send.php :

try {
   $consumer = \MonsterMQ\Client\Consumer();

   $consumer->connect('127.0.0.1', 5672);
   $consumer->logIn('guest', 'guest');

   $consumer->queue('test-queue')->declare();
} catch(\Exception $e) {
   var_dump($e);
}

Beachten Sie, dass wir in receive.php auch unsere Warteschlange deklarieren. Dies bedeutet, dass der Empfänger die Warteschlange deklariert, wenn sie vor dem Absender gestartet wird.
Um dem Server mitzuteilen, dass wir eine Nachricht von ihm empfangen möchten, und um einen Zyklus zu starten, der wartet und eingehende Nachrichten verarbeitet, schreiben wir den folgenden Code:

try {
   $consumer = \MonsterMQ\Client\Consumer();

   $consumer->connect('127.0.0.1', 5672);
   $consumer->logIn('guest', 'guest');

   $consumer->queue('test-queue')->declare();

   $consumer->consume('test-queue');

   $consumer->wait(function ($message, $channelNumber) use ($consumer){
      echo "Message - {$message} received on channel {$channelNumber}";
   });
} catch(\Exception $e) {
   var_dump($e);
}

Starten


Jetzt können wir beide Skripte als Empfänger ausführen:

php receive.php

also Absender:

php send.php

Der Empfänger gibt die Nachricht, die er von RabbitMQ (das wiederum von send.php erhält) und die verwendete Kanalnummer an die Konsole aus. Es wird so lange ausgeführt, bis Sie das Terminal schließen oder die Ausführung durch Drücken von Strg + C beenden. Durch Starten des Absenders in einem anderen Terminal können Sie beobachten, wie Nachrichten an den Empfänger übermittelt und in der Konsole angezeigt werden.

Wenn Sie sehen möchten, welche RabbitMQ im Moment Warteschlangen enthält und wie viele Nachrichten sich darin befinden, können Sie dies als privilegierter Benutzer mit rabbitmqctl tun
sudo rabbitmqctl list_queues


Verwenden Sie unter Windows kein Sudo
rabbitmqctl.bat list_queues


Jetzt sind wir bereit, mit dem nächsten Teil unseres Unterrichts fortzufahren.

All Articles