将RabbitMQ与MonsterMQ结合使用第1部分

本文适用于不熟悉队列和RabbitMQ的用户。那些已经知道如何使用RabbitMQ并只想探索MonsterMQ提供的可能性的人,我建议访问github.com上的项目页面,其中的描述详细描述了如何使用MonsterMQ,而没有描述使用RabbitMQ的基础知识。本文的其余部分将介绍RabbitMQ与MonsterMQ一起工作的基础知识。

RabbitMQ是消息代理。它接收,存储并将消息转发给其客户。客户端的消息发送者和接收者可以服务于用PHP编写的应用程序。客户端和RabbitMQ之间的通信根据称为AMQP(高级消息队列协议)的某些规则进行。例如,浏览器和本文所在的Web服务器之间的通信也遵循某些规则,它们称为HTTP(超文本传输​​协议)-超文本传输​​协议。 HTTP和AMQP都是客户端-服务器协议,也就是说,它们暗示客户端和服务器的存在。 RabbitMQ是AMQP服务器,MonsterMQ是一个库,可让您使用PHP快速编写AMQP客户端,该客户端将与AMQP服务器进行通信。

AMQP和RabbitMQ使用以下术语:

生产-发送消息的方式,生产者(供应商)-发送消息的人。

图片

消费-表示接收消息。消费者-接收消息的人。

图片

队列就是队列。在到达消费者之前和供应商发送消息之后,该消息存储在RabbitMQ内部的队列中。队列是存储消息的缓冲区。许多提供程序可以在一个队列中发送消息,许多使用者可以从一个队列中读取消息。

图片

请注意,提供者,消费者和经纪人不必位于同一主机上,相反,它们通常位于不同的主机上。

你好,世界


在本文的后面,我们将使用MonsterMQ库在PHP中编写两个程序,其中一个将发送消息,另一个将接收并将它们输出到控制台。在下图中,“ P”是提供者,“ C”是使用者,红色框是作为消息缓冲区的队列(每个框是消息)。

图片
(图片取自RabbitMQ官方网站

为了进行进一步的工作,我们需要安装MonsterMQ,为此,请在控制台中输入以下命令:

composer require goootlib/monster-mq:dev-master

(有关安装MonsterMQ的更多信息,请参见github.com上的项目页面。)
此命令将在当前文件夹中安装MonsterMQ。

离开


我们将发送方称为send.php,将接收方称为receive.php发件人将加入服务器并发送消息。
要加入服务器,请在send.php中编写以下代码

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

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

在此代码中,我们加入了在标准端口上的本地服务器上运行的RabbitMQ。如果RabbitMQ正在其他地址上运行,请指定其他ip地址和端口。连接之后,我们还调用logIn()方法,该方法以标准的登录名和密码开始会话。如果您有一个在RabbitMQ中配置了不同用户名和密码的帐户,请在此处指定。

要发送消息,我们必须声明将首先放置消息的队列。队列宣布后,我们可以发送一条消息:

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

队列声明是幂等的,也就是说,如果队列已经存在,则不会创建并且不会更改队列。完成会议并加入后。

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

接收讯息


与发件人不同,收件人将保持运行状态以侦听传入的消息。receive.php代码中,首先需要执行与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);
}

请注意,在receive.php中,我们还声明了队列,以便接收方在发送方之前启动队列。
为了告诉服务器我们要从中接收消息,并开始一个等待和处理传入消息的循环,我们将编写以下代码:

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

发射


现在我们可以将两个脚本作为接收者运行:

php receive.php

寄件者:

php send.php

接收者将向控制台输出他将从RabbitMQ接收的消息(该消息又将从send.php接收)以及所使用的通道号。它会继续执行,直到您关闭终端,或通过按Ctrl + C停止执行它为止。通过在另一个终端中启动发件人,您可以观察到消息如何传递给收件人并在控制台中显示。

如果要查看当前RabbitMQ包含哪些队列以及队列中有多少消息,可以使用Rabbitmqctl作为特权用户来执行此操作
sudo rabbitmqctl list_queues


在Windows上不要使用sudo
rabbitmqctl.bat list_queues


现在,我们准备继续进行下一节的课程。

All Articles