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.
Consumir - significa receber mensagens. Consumidor - aquele que recebe mensagens.
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.
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 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 rabbitmqctlsudo rabbitmqctl list_queues
No Windows, não use sudorabbitmqctl.bat list_queues
Agora estamos prontos para avançar para a próxima parte de nossas lições.