Usando RabbitMQ com MonsterMQ Parte 1

Este artigo é direcionado para aqueles que ainda não estão familiarizados com filas e RabbitMQ. Para aqueles que já sabem trabalhar com o RabbitMQ e desejam apenas explorar as possibilidades que o MonsterMQ oferece, recomendo visitar a página do projeto no github.com, onde a descrição descreve em detalhes como usar o MonsterMQ sem descrever os conceitos básicos de trabalho com o RabbitMQ. O restante deste artigo abordará os conceitos básicos de como o RabbitMQ funciona com o MonsterMQ.

RabbitMQ é um intermediário de mensagens. Ele recebe, armazena e encaminha mensagens para seus clientes. Clientes remetentes e destinatários de mensagens podem servir, por exemplo, aplicativos escritos em PHP. A comunicação entre o cliente e o RabbitMQ ocorre de acordo com certas regras chamadas AMQP (Advanced Message Queuing Protocol). Por exemplo, a comunicação entre o navegador e o servidor da web em que este artigo está localizado também segue determinadas regras, chamadas de HTTP (HyperText Transfer Protocol) - um protocolo de transferência de hipertexto. HTTP e AMQP são protocolos cliente-servidor, ou seja, significam a presença de um cliente e um servidor. O RabbitMQ é um servidor AMQP e o MonsterMQ é uma biblioteca que permite escrever rapidamente um cliente AMQP em PHP, que se comunicará com o servidor AMQP.

O AMQP e o RabbitMQ usam os seguintes termos:

Produção - significa enviar mensagens, Produtor (fornecedor) - aquele que envia mensagens.

imagem

Consumir - significa receber mensagens. Consumidor - aquele que recebe mensagens.

imagem

Fila é a fila. Antes de chegar ao consumidor e após o envio pelo fornecedor, a mensagem é armazenada em uma fila no RabbitMQ. A fila é um buffer que armazena mensagens. Muitos provedores podem enviar mensagens em uma fila e muitos consumidores podem ler mensagens de uma fila.

imagem

Observe que o provedor, o consumidor e o corretor não precisam estar no mesmo host; pelo contrário, eles geralmente estão localizados em diferentes.

Olá Mundo


Mais adiante neste artigo, escreveremos dois programas em PHP usando a biblioteca MonsterMQ, um dos quais enviará mensagens e o outro os receberá e enviará para o console. Na figura abaixo, “P” é o provedor, “C” é o consumidor, caixas vermelhas são a fila que é o buffer de mensagens (cada caixa é a mensagem).

imagem
(Imagem retirada do site oficial do RabbitMQ )

Para mais trabalhos, precisamos instalar o MonsterMQ, para fazer isso, digite o seguinte comando no console:

composer require goootlib/monster-mq:dev-master

(Mais informações sobre a instalação do MonsterMQ podem ser encontradas na página do projeto em github.com)
Este comando instalará o MonsterMQ na pasta atual.

Saída


Vamos ligar para o remetente send.php e o destinatário receive.php . O remetente ingressará no servidor e enviará a mensagem.
Para ingressar no servidor, escreva o seguinte código em send.php :.

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

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

Neste código, ingressamos no RabbitMQ em execução em um servidor local em uma porta padrão. Especifique outro endereço IP e porta se o RabbitMQ estiver sendo executado no seu outro endereço. Após a conexão, também chamamos o método logIn (), que inicia a sessão com o login e a senha padrão. Se você tiver uma conta com um nome de usuário e senha diferentes configurados no RabbitMQ, especifique-os aqui.

Para enviar uma mensagem, devemos declarar a fila na qual ela será colocada primeiro. Após o anúncio da fila, podemos enviar uma mensagem:

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

A declaração da fila é idempotente, ou seja, não será criada nem alterada, se já existir. Depois de concluir a sessão e participar.

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

Receber mensagem


Ao contrário do remetente, o destinatário permanecerá em execução para ouvir as mensagens recebidas. No código receive.php , primeiro você precisa fazer o mesmo que no 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);
}

Observe que em receive.php também declaramos nossa fila, para que o destinatário declare a fila se ela for iniciada antes do remetente.
Para dizer ao servidor que queremos receber uma mensagem dele e também para iniciar um ciclo que aguardará e processará as mensagens recebidas, escreveremos o seguinte 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);
}

Lançamento


Agora podemos executar os dois scripts como o destinatário:

php receive.php

então remetente:

php send.php

O destinatário enviará para o console a mensagem que ele receberá do RabbitMQ (que por sua vez o receberá de send.php) e o número do canal usado. Ele continuará sendo executado até você fechar o terminal ou até parar de executá-lo pressionando Ctrl + C. Ao iniciar o remetente em outro terminal, você pode observar como as mensagens são entregues ao destinatário e exibidas no console.

Se você deseja ver quais, no momento, o RabbitMQ contém filas e quantas mensagens estão nelas, é possível fazer isso como um usuário privilegiado usando rabbitmqctl
sudo rabbitmqctl list_queues


No Windows, não use sudo
rabbitmqctl.bat list_queues


Agora estamos prontos para avançar para a próxima parte de nossas lições.

All Articles