Utilisation de RabbitMQ avec MonsterMQ Partie 1

Cet article est destiné à ceux qui ne sont pas encore familiarisés avec les files d'attente et RabbitMQ. Ceux qui savent déjà comment travailler avec RabbitMQ et veulent seulement explorer les possibilités qu'offre MonsterMQ, je recommande de visiter la page du projet sur github.com, où la description décrit en détail comment vous pouvez utiliser MonsterMQ sans décrire les bases de travailler avec RabbitMQ. Le reste de cet article couvrira les bases du fonctionnement de RabbitMQ avec MonsterMQ.

RabbitMQ est un courtier de messages. Il reçoit, stocke et transmet des messages à ses clients. Les clients expéditeurs et destinataires de messages peuvent servir, par exemple, des applications écrites en PHP. La communication entre le client et RabbitMQ se fait selon certaines règles appelées AMQP (Advanced Message Queuing Protocol). Par exemple, la communication entre votre navigateur et le serveur Web sur lequel se trouve cet article suit également certaines règles, elles sont appelées HTTP (HyperText Transfer Protocol) - un protocole de transfert hypertexte. HTTP et AMQP sont des protocoles client-serveur, c'est-à-dire qu'ils impliquent la présence d'un client et d'un serveur. RabbitMQ est un serveur AMQP, et MonsterMQ est une bibliothèque qui vous permet d'écrire rapidement un client AMQP en PHP, qui communiquera avec le serveur AMQP.

AMQP et RabbitMQ utilisent les termes suivants:

Produire - signifie envoyer des messages, Producteur (fournisseur) - celui qui envoie les messages.

image

Consommer - signifie recevoir des messages. Consommateur - celui qui reçoit des messages.

image

La file d'attente est la file d'attente. Avant d'atteindre le consommateur et après avoir été envoyé par le fournisseur, le message est stocké dans une file d'attente à l'intérieur de RabbitMQ. La file d'attente est un tampon qui stocke les messages. De nombreux fournisseurs peuvent envoyer des messages dans une file d'attente et de nombreux consommateurs peuvent lire les messages d'une file d'attente.

image

Notez que le fournisseur, le consommateur et le courtier ne doivent pas nécessairement être sur le même hôte, au contraire, ils sont généralement situés sur différents.

Bonjour le monde


Plus loin dans cet article, nous écrirons deux programmes en PHP à l'aide de la bibliothèque MonsterMQ, dont l'un enverra des messages, et l'autre les recevra et les affichera sur la console. Dans la figure ci-dessous, «P» est le fournisseur, «C» est le consommateur, les cases rouges sont la file d'attente qui est le tampon des messages (chaque case est le message).

image
(Image prise sur le site officiel de RabbitMQ )

Pour poursuivre les travaux, nous devons installer MonsterMQ, pour ce faire, entrez la commande suivante dans la console:

composer require goootlib/monster-mq:dev-master

(Vous trouverez plus d'informations sur l'installation de MonsterMQ sur la page du projet sur github.com)
Cette commande installera MonsterMQ dans le dossier actuel.

Départ


Nous appellerons notre expéditeur send.php et le destinataire receive.php . L'expéditeur rejoindra le serveur et enverra le message.
Pour rejoindre le serveur, écrire le code suivant dans send.php :.

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

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

Dans ce code, nous rejoignons RabbitMQ fonctionnant sur un serveur local sur un port standard. Spécifiez une autre adresse IP et un autre port si RabbitMQ s'exécute sur votre autre adresse. Après la connexion, nous appelons également la méthode logIn (), qui démarre la session avec le login et le mot de passe standard. Si vous avez un compte avec un nom d'utilisateur et un mot de passe différents configurés dans RabbitMQ, spécifiez-les ici.

Pour envoyer un message, nous devons déclarer la file d'attente dans laquelle il sera d'abord placé. Après l'annonce de la file d'attente, nous pouvons envoyer un message:

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);
}

La déclaration de file d'attente est idempotente, c'est-à-dire qu'elle ne créera pas et ne modifiera pas la file d'attente, si elle existe déjà. Après avoir terminé la session et nous rejoindre.

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);
}

Recevoir un message


Contrairement à l'expéditeur, le destinataire continuera de fonctionner afin d'écouter les messages entrants. Dans le code receive.php , vous devez d'abord faire la même chose que dans 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);
}

Notez que dans receive.php, nous déclarons également notre file d'attente, c'est pour que le destinataire déclare la file d'attente si elle est démarrée avant l'expéditeur.
Afin d'indiquer au serveur que nous souhaitons en recevoir un message, ainsi que de démarrer un cycle qui attendra et traitera les messages entrants, nous écrirons le code suivant:

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);
}

lancement


Maintenant, nous pouvons exécuter les deux scripts en tant que destinataire:

php receive.php

donc expéditeur:

php send.php

Le destinataire transmettra à la console le message qu'il recevra de RabbitMQ (qui à son tour le recevra de send.php) et le numéro de canal utilisé. Il continuera à être exécuté jusqu'à ce que vous fermiez le terminal ou jusqu'à ce que vous arrêtiez de l'exécuter en appuyant sur Ctrl + C. En lançant l'expéditeur dans un autre terminal, vous pouvez observer comment les messages sont remis au destinataire et affichés dans la console.

Si vous voulez voir qui, pour le moment, RabbitMQ contient des files d'attente et combien de messages y sont, vous pouvez le faire en tant qu'utilisateur privilégié en utilisant rabbitmqctl
sudo rabbitmqctl list_queues


Sur Windows, n'utilisez pas sudo
rabbitmqctl.bat list_queues


Nous sommes maintenant prêts à passer à la prochaine partie de nos leçons.

All Articles