文档中心>消息队列 RabbitMQ 版>实践教程>RabbitMQ 支持 MQTT 协议使用说明

RabbitMQ 支持 MQTT 协议使用说明

最近更新时间:2024-01-29 15:17:01

我的收藏

方案介绍

MQTT 是目前广泛使用的物联网协议,RabbitMQ 是基于 AMQP 0.9.1 协议实现的广泛使用的开源消息队列产品,RabbitMQ 以插件的形式支持了 MQTT 协议,可以在 RabbitMQ 集群上方便的支持 MQTT 协议,实现对物联网等业务场景的支持。
社区参考文档:
1. RabbitMQ 3.11 之前版本插件支持 MQTT 协议: MQTT Plugin — RabbitMQ
2. RabbitMQ 3.12 版本原生支持 MQTT 协议: Serving Millions of Clients with Native MQTT | RabbitMQ - Blog

操作步骤

步骤1:购买云上或自建RabbitMQ集群

云上直接购买 RabbitMQ 集群,立即选购
或者自己搭建 RabbitMQ 集群,详细参见: Downloading and Installing RabbitMQ — RabbitMQ

步骤2:开启MQTT插件

通过在集群节点执行以下命令开启MQTT插件:
sudo rabbitmq-plugins enable rabbitmq_mqtt
腾讯云的 RabbitMQ 插件管理功能正在开发中,目前可以通过提交工单来开启 MQTT 插件和打通网络工作。
开启 mqtt 插件后,可以在管控台看到新增的1883端口:


步骤3:验证 MQTT 的可用性

可以下载常用的 mqttx(MQTTX:全功能 MQTT 客户端工具)客户端工具来验证一下:
1. 新建连接,填写地址和端口。用户名和密码选用 RabbitMQ 的用户名和密码即可。

2. 新建订阅,订阅 testtopic/# 主题的消息。

3. 检查 RabbitMQ 的队列情况,可以看到每个订阅会在 RabbitMQ 新增一个队列。

4. 收发消息验证,发送 testtopic/123456消息,立即可以通过订阅收到消息。

5. 查看 RabbitMQ 监控,可以看到刚才的队列有一次收发消息的监控。

6. 验证 MQTT 上行消息和 RabbitMQ 的消息互通性,MQTT 发送消息也可以路由到普通队列,由 RabbitMQ 下游应用来消费这个消息。


7. 验证 RabbitMQ 和 MQTT 下行消息的互通性,可以 RabbitMQ 发送消息,MQTT 订阅到消息。


8. 验证总结。通过以上验证可以确认,RabbitMQ 的 MQTT 插件,可以支持正常的 MQTT 消息收发,也可以支持 MQTT 上行消息到应用,也可以支持应用发送 MQTT 消息下行消息到订阅端,并且有完善的监控。

实现原理

3.11 版本之前的实现原理,通过 MQTT 消息转为 AMQP 协议,实现 MQTT 的消息收发。

3.12 之后版本的实现原理,不再经过 AMQP 协议转换,理论上有更好的性能。


注意事项

我们推荐使用现在的稳定版本3.8.x 或3.11.x等稳定版本,没有已知 Bug。
因为3.12.x版本是新发布的版本,MQTT 实现有重新实现刚发布初始版本,我们在验证过程中,发现监控不准,RabbitMQ 互通偶尔异常等问题。因此不推荐生产环境使用3.12版本
目前支持主流的 MQTT v3 和v3.1版本,暂不支持v5版本,RabbitMQ 预计3.13版本才会支持
MQTT 协议的 topic 使用"/"分割 topic, AMQP 协议的 Topic(Routingkey)使用 "."分割 topic,所以在协议转换的时候会自动转换,应用使用的时候要注意这个差别。
不推荐 MQTT 使用匿名连接或“no login credentials”,因为 AMQP 协议会自动转换为默认用户 guest 或 mqtt.default_user,不方便做权限管控。
关于订阅持久性,注意 MQTT 和 AMQP 队列持久性的映射。
Transient clients that use transient (non-persistent) messages
Stateful clients that use durable subscriptions (non-clean sessions, QoS1)优先使用镜像队列,不要使用 Quorum Queues 特性,因为 Quorum 要求至少三节点,并且新特性稳定性待验证,暂不推荐使用。
优先使用镜像队列,不要使用 Quorum Queues 特性,因为 Quorum 要求至少三节点,并且新特性稳定性待验证,暂不推荐使用。