RabbitMQ的五种工作队列-简单队列

RabbitMQ的五种工作队列

  • 简单队列
  • 工作队列
  • 发布/订阅
  • 路由模式
  • 主题模式

简单队列

一个生产者对应一个消费者

在下面的图中,“P”是我们的生产和“C”是我们的消费者。中间的框是一个队列 - 一个RabbitMQ保持代表消费者的消息缓冲区。

php-amqplib客户端

RabbitMQ使用的是AMQP协议。要使用她你就必须需要一个使用同样协议的库。几乎所有的编程语言都有可选择的库。PHP也是一样,我们将在本教程中使用php-amqplib,并且使用Composer依赖管理:

php-amqplib

在你的项目中添加一个 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();

这是整个 send.php 源码。

发送不成功!

如果这是你第一次使用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)将传递给接收的消息。

这是整个 receive.php 源代码。

参考文档

posted @ 2020-05-21 11:15  phper-liunian  阅读(322)  评论(0编辑  收藏  举报