RabbitMQ Part1 (hello Wrold!)

1 “hello Wrold!”

先决条件:
该教学认为你已经安装了 RabbitMQ,并且在本地运行在标准的端口(5672)。如果你使用了不同的主机,端口及账号,在连接设置部分需要适当调整。

简介

RabbitMQ 是一个消息代理:它接收并转发消息。你可以认为它是一个邮局:当你将想要发送的邮件放到邮箱里面以后,而且可以确信邮递员可以把你的邮件送到接受着手里。在这里类比中,RabbitMQ 就是那个邮箱,邮局和邮递员。

RabbitMQ 和 邮局的主要区别是不处理邮件,而是接收、存储、转发二进制数据块 – 通常称为消息。

RabbitMQ,以及消息传递一般使用一些行话:

  • 生产只代表发送。发送消息的程序就是一个生产者:这里用一个圆圈加P表示。

  • 一个队列大概就是一个存在于 RabbitMQ 内部的邮箱。尽管消息会流过 RabbitMQ 以及你的应用,他们只会被存储在队列内部。队列只受主机内存和磁盘限制的约束,本质上是一个大的消息缓冲区。多个生产者可以发送消息到指定的一个队列,而多个消费者可以从一个队列中接收消息。我们用如下方式代表一个队列:

  • 消费与接收的意思相同。消费着就是一个等待接收数据的程序:

需要注意的是生产者、消费者以及代理可能并不在一个主机上;大多数应用也确实是这样。一个应用程序可以即是生产者也是消费者。

示例:

(需要安装 php-amqplib 客户端)
composer.json 文件

{
    "require": {
        "php-amqplib/php-amqplib": ">=2.6.1"
    }
}

这里有两个程序,一个生产者发送单个消息,一个消费者接受消息并打印出来。我们将隐藏 php-amqplib API 中的一些细节,专注于这个简单的 “Hello World” 消息示例:

下面的图表中,“P“代表生产者,“C”代表消费者。中间的盒子代表队列 – 一个 RabittMQ 替消费者保存的消息缓冲。

发送

消息发布者为文件 send.php,消息接收者为文件 receive.php。消息发布者将会连接 RabbitMQ,发送一条消息,然后退出。

  1. send.php 中,需要引入相应的库文件,并 use必要的类;
  2. 然后创建一个连接;
    连接抽象了套接字连接,并且为我们处理的协议版本协商以及认证等操作。这里我们连接到本地的代理机器,因此是 localhost。如果我们想要连接不同机器的代理需要制定名字或者 IP 。

下一步创建了 channel,即大部分 API 完成都需要通过它来工作;

要发送就咬声明要发送的队列;然后就可以将消息发布到该队列了:

声明一个队列是幂等的,它只会在不存在是才回被创建。消息内容是一个字节数组,你可以以喜欢的方式编码。

最后,关闭 channel 及连接;

send.php 中代码如下:

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$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 但是并没有看到 “Send”,那么你可能会挠头,想知道可能出了什么问题。
可能是 RabbitMQ 服务器启动的时候没有足够的空余磁盘空间,所以才不会接受消息(默认至少需要 200MB 空间)。通过检查 broker 的日志来确认问题,必要时改小该限制。文档[https://www.rabbitmq.com/configure.html#config-items],其中,该参数为 disk_free_limit

接收

上面讲的发布者。接受者通过 RabbitMQ 服务器监听消息,所以并不会像发布者一样发布一条消息,我们会持续的监听消息并打印出来。
receive.php 中代码如下:

<?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";

$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->close();
$connection->close();
?>

设置跟发布者一样;我们打开一个连接和一个 channel,并声明一个将要消费的队列。注意,这个队列与发布者的队列相同。

我们将要告诉服务器把队列里的消息发送给我们。现在定义一个 PHP 的回调用来接受服务器发送来的消息。请记住,消息是从服务器异步发送到客户端的。

代码会在 $channel 有回调时阻塞。一旦收到消息,就会将其传给 $callback

执行

现在,在终端启动消费者:
php receive.php
然后启动发布者:
php send.php

消费者会打印出通过 RabbitMQ 得到的发送者的消息。接收着一直运行,等待接收消息(使用 Ctrl-C 停止),可以尝试在其他终端运行发送着。

列出所有的队列
你可能希望查看 RabbitMQ 具体有什么队列,队列里有多少消息。(作为一个授权用户)可以使用 rabbitmqctl 工具:
sudo rabbitmqctl list_queues
在 Windows 上,省略 sudo:
rabbitmqctl.bat list_queues

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值