RabbitMQ的五种工作队列-简单队列
RabbitMQ的五种工作队列
- 简单队列
- 工作队列
- 发布/订阅
- 路由模式
- 主题模式
简单队列
一个生产者对应一个消费者
在下面的图中,“P”是我们的生产和“C”是我们的消费者。中间的框是一个队列 - 一个RabbitMQ保持代表消费者的消息缓冲区。
php-amqplib客户端
RabbitMQ使用的是AMQP协议。要使用她你就必须需要一个使用同样协议的库。几乎所有的编程语言都有可选择的库。PHP也是一样,我们将在本教程中使用php-amqplib,并且使用Composer依赖管理:
在你的项目中添加一个 composer.json文件:
{ "require": { "php-amqplib/php-amqplib": "2.6.1" } }
只要你已经安装Composer功能,你可以运行以下:
composer install
发送消息
我们将调用我们消息发送者send.php,并调用我们的消息接收者 receive.php 。消息发送者将要连接RabbitMQ,发送一个消息,然后退出。
//需要包含库和使用必要的类
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
//建立一个到RabbitMQ服务器的连接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
//要发送,我们必须为我们发送声明一个队列,然后我们可以向队列发布消息:
$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');
echo " [x] Sent 'Hello World!'\n";
//关闭通道和连接
$channel->close();
$connection->close();
发送不成功!
如果这是你第一次使用RabbitMQ,并且没有看到“Sent”消息出现在屏幕上,你可能会抓耳挠腮不知所以。这也许是因为没有足够的磁盘空间给代理使用所造成的(代理默认需要1Gb的空闲空间),所以它才会拒绝接收消息。查看一下代理的日志确定并且减少必要>的限制。配置文件文档会告诉你如何更改磁盘空间限制(disk_free_limit)。
获取数据
那是我们的发送者。我们的接受者获取从RabbitMQ推过来的消息,所以不像发送者发布一个消息,我们将保持运行监听消息并打印出来。
代码receive.php具有几乎相同的包括和加载
//需要包含库和使用必要的类
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
//设置和发送者是一样的,我们打开一个连接和一个通道,然后声明我们将要消耗的队列。请注意,这与发送的队列中的队列相匹配
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";
//请注意,我们在这里声明队列。因为在发送者之前,我们可以启动接收者,所以我们希望在尝试消费它的消息之前先确保队列的存在。我们将要告诉服务器从队列中传递消息。我们将定义一个PHP回调将接收服务器发送的消息。请记住,消息是从服务器异步发送到客户端的。
$callback = function($msg) {
echo " [x] Received ", $msg->body, "\n";
};
$channel->basic_consume('hello', '', false, true, false, false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
//代码块循环 通道($channel )的回调。无论什么时候我们收到消息我们的回调函数($callback)将传递给接收的消息。