Usando RabbitMQ con MonsterMQ Parte 1

Este artículo está destinado a aquellos que aún no están familiarizados con las colas y RabbitMQ. Aquellos que ya saben cómo trabajar con RabbitMQ y solo quieren explorar las posibilidades que ofrece MonsterMQ, les recomiendo visitar la página del proyecto en github.com, donde la descripción describe en detalle cómo puede usar MonsterMQ sin describir los conceptos básicos de trabajar con RabbitMQ. El resto de este artículo cubrirá los conceptos básicos de cómo funciona RabbitMQ con MonsterMQ.

RabbitMQ es un agente de mensajes. Recibe, almacena y reenvía mensajes a sus clientes. Los clientes remitentes y destinatarios de mensajes pueden servir, por ejemplo, aplicaciones escritas en PHP. La comunicación entre el cliente y RabbitMQ ocurre de acuerdo con ciertas reglas llamadas AMQP (Advanced Message Queuing Protocol). Por ejemplo, la comunicación entre su navegador y el servidor web en el que se encuentra este artículo también sigue ciertas reglas, se denominan HTTP (Protocolo de transferencia de hipertexto), un protocolo de transferencia de hipertexto. Tanto HTTP como AMQP son protocolos cliente-servidor, es decir, implican la presencia de un cliente y un servidor. RabbitMQ es un servidor AMQP, y MonsterMQ es una biblioteca que le permite escribir rápidamente un cliente AMQP en PHP, que se comunicará con el servidor AMQP.

AMQP y RabbitMQ usan los siguientes términos:

Producir - significa enviar mensajes, Productor (proveedor) - el que envía los mensajes.

imagen

Consumir: significa recibir mensajes. Consumidor: el que recibe los mensajes.

imagen

La cola es la cola. Antes de llegar al consumidor y después de que fue enviado por el proveedor, el mensaje se almacena en una cola dentro de RabbitMQ. La cola es un búfer que almacena mensajes. Muchos proveedores pueden enviar mensajes en una cola, y muchos consumidores pueden leer mensajes desde una cola.

imagen

Tenga en cuenta que el proveedor, el consumidor y el corredor no tienen que estar en el mismo host, por el contrario, generalmente se encuentran en diferentes.

Hola Mundo


Más adelante en este artículo, escribiremos dos programas en PHP utilizando la biblioteca MonsterMQ, uno de los cuales enviará mensajes y el otro los recibirá y enviará a la consola. En la figura siguiente, "P" es el proveedor, "C" es el consumidor, los cuadros rojos son la cola que es el búfer de mensajes (cada cuadro es el mensaje).

imagen
(Imagen tomada del sitio web oficial de RabbitMQ )

Para más trabajo, necesitamos instalar MonsterMQ, para hacer esto, ingrese el siguiente comando en la consola:

composer require goootlib/monster-mq:dev-master

(Puede encontrar más información sobre la instalación de MonsterMQ en la página del proyecto en github.com)
Este comando instalará MonsterMQ en la carpeta actual.

Salida


Llamaremos a nuestro remitente send.php , y el destinatario recibe.php . El remitente se unirá al servidor y enviará el mensaje.
Para unirse al servidor, escriba el siguiente código en send.php :.

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

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

En este código, nos unimos a RabbitMQ que se ejecuta en un servidor local en un puerto estándar. Especifique otra dirección IP y puerto si RabbitMQ se está ejecutando en su otra dirección. Después de la conexión, también llamamos al método logIn (), que inicia la sesión con el inicio de sesión y la contraseña estándar. Si tiene una cuenta con un nombre de usuario y contraseña diferentes configurados en RabbitMQ, especifíquelos aquí.

Para enviar un mensaje, debemos declarar la cola en la que se colocará primero. Después de anunciar la cola, podemos enviar un mensaje:

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 declaración de la cola es idempotente, es decir, no creará y no cambiará la cola, si ya existe. Después de completar la sesión y unirnos.

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

Recibir mensaje


A diferencia del remitente, el destinatario seguirá ejecutándose para escuchar los mensajes entrantes. En el código Receive.php , primero debe hacer lo mismo que en 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);
}

Tenga en cuenta que en accept.php también declaramos nuestra cola, esto es para que el destinatario declare la cola si se inicia antes que el remitente.
Para decirle al servidor que queremos recibir un mensaje de él, así como para iniciar un ciclo que esperará y procesará los mensajes entrantes, escribiremos el siguiente código:

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

Lanzamiento


Ahora podemos ejecutar ambos scripts como destinatario:

php receive.php

entonces remitente:

php send.php

El destinatario enviará a la consola el mensaje que recibirá de RabbitMQ (que a su vez lo recibirá de send.php) y el número de canal utilizado. Continuará ejecutándose hasta que cierre el terminal, o hasta que deje de ejecutarlo presionando Ctrl + C. Al iniciar el remitente en otra terminal, puede observar cómo se entregan los mensajes al destinatario y se muestran en la consola.

Si desea ver qué, en este momento, RabbitMQ contiene colas y cuántos mensajes hay en ellas, puede hacerlo como un usuario privilegiado usando rabbitmqctl
sudo rabbitmqctl list_queues


En windows no use sudo
rabbitmqctl.bat list_queues


Ahora estamos listos para pasar a la siguiente parte de nuestras lecciones.

All Articles