方案介绍
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集群
步骤2:开启MQTT插件
通过在集群节点执行以下命令开启MQTT插件:
sudo rabbitmq-plugins enable rabbitmq_mqtt
开启 mqtt 插件后,可以在管控台看到新增的1883端口:
?
步骤3:验证 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 要求至少三节点,并且新特性稳定性待验证,暂不推荐使用。