有关 RabbitMQ 快速部署与使用

这篇文章是根据自己的理解,讲解有关 RabbitMQ 的一些基础知识.另外包括部署,基本设置,信道,路由交换,队列及等等基础概念. 这些将在后续文章中一一道来

什么是RabbitMQ?

惯例开头,要理解一个工具,必须先了解这个工具是干什么的,可以用在什么的地方,这样才能更好的使用.

RabbitMQ 本质是一个实现了 AMQP 协议的一个工具,与其相似的还有 RocketMQ, Kafka, ActiveMQ, ZreoMQ 等等.其主要解决的问题是可以安全可靠的向应用之间传递消息,以便不同应用,不同语言的程序之间的消息传递.

我们知道能完成不同应用之间消息传递方式有很多,比如 HTTP,又比如数据库.但对比与 AMQP 来说,它比 HTTP 更安全,又比数据库更轻量,更方便.并且还支持多种链路协议,这样使得消息队列能够实现多种多样的消息传递方式.所以现如今消息队列广泛的使用在项目开发中,作为微服务之间的通讯或项目之间的解耦.

这次就简单的说一下基于 AMQP 协议,以 erlang 开发的消息队列中间件 RabbitMQ

如何快速部署

为了快速演示,建议使用 Docker 部署.Docker Hub 上也有关于如何部署 RabbitMQ 的文档

此处我们选用带有可视化操作面板的版本,

1
2
3
4
5
# 拉取镜像
docker pull rabbitmq:3.7.15-management

# 运行容器
docker run --name myRabbit -d -p 5672:5672 -p 15672:15672 rabbitmq:3.7.15-management

仅仅两行命令,就启动了一个 RabbitMQ. 那么上面 docker run 命令,开启了两个端口映射,分别是

  • 5672(默认服务端口),传递接收消息此本端口完成
  • 15672 (可视化面板端口), 由于是在本地开启的容器,所以访问 127.0.0.1:15672, 即可访问管理面板
  • 默认登录账号为: guest 密码: guest

可以登录管理面板观察下各个按钮及栏目

快速使用

那么在一个消息的收发过程中,必须有发送者和接受者, 在 MQ 中我们称之为生产者(producer), 消费者(consumer),非常形象

所以我们的示例中也是需要 producer 与 consumer 两份代码. 代码参照官方示例文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// consumer.php
require_once "vendor/autoload.php";

use PhpAmqpLib\Connection\AMQPConnection;
use PhpAmqpLib\Exception\AMQPException;

try {
// 创建连接
$conn = new AMQPConnection("127.0.0.1", 5672, "guest", "guest");
// 创建信道
$chan = $conn->channel();
// 声明队列
$chan->queue_declare("testQueue",false, false, false, false);

// 创建回调函数
$callback = function ($msg) {
echo '[√] Received: ', $msg->body, "\n";
};
// 消费队列中的消息
$chan->basic_consume('testQueue', '', false, true, false, false, $callback);

// 确认回调是否执行完毕,否则等待
while (count($chan->callbacks)) {
$chan->wait();
}

} catch (AMQPException $e) {
echo sprintf("[x] Received Error:%s %s, line %s" . PHP_EOL, $e->getCode(), $e->getMessage(), $e->getLine());
} catch (\Throwable $th) {
echo sprintf("[x] Received Error:%s %s, line %s" . PHP_EOL, $th->getCode(), $th->getMessage(), $th->getLine());
}

然后使用 php-cli 运行起来:

php comsumer.php

接着程序会一直阻塞运行等待消息的到来.

下面是 producer.php 的编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// producer.php
<?php
require_once "vendor/autoload.php";

use PhpAmqpLib\Connection\AMQPConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Exception\AMQPException;

try {
$conn = new AMQPConnection("127.0.0.1", 5672, "guest", "guest");

$chan = $conn->channel();
$chan->queue_declare("testQueue", false, false, false, false);

$str = "hello, this is test";
$msg = new AMQPMessage($str);

$chan->basic_publish($msg, "", "testQueue");

echo "[√] Sent 'Hello World!'\n";
} catch (AMQPException $e) {
echo sprintf("[x] Sent Error:%s %s, line %s" . PHP_EOL, $e->getCode(), $e->getMessage(), $e->getLine());
} catch (\Throwable $th) {
echo sprintf("[x] Sent Error:%s %s, line %s" . PHP_EOL, $th->getCode(), $th->getMessage(), $th->getLine());
}

开启另一个控制台, 并运行:

php producer.php
即可看到效果

总结

本篇文章,暂时仅对 RabbitMQ 的安装,以及在 PHP 上的使用,做了简要介绍.相关的更深入解析文章后续会陆续发布