RabbitMQ MQTT插件问题:发送的消息未出现在绑定队列中
问题排查与解决方案:MQTT消息入队失败但速率图上升
以下是针对该问题的具体排查步骤和解决方法:
检查队列绑定与消息投递的匹配性
- 确认发布者的QoS级别:若使用QoS 0,且订阅者未提前在线,RabbitMQ MQTT插件默认不会将消息留存到绑定队列。需开启消息留存(发布时设置
retain=True)或队列持久化(创建队列时勾选Durable)。 - 验证路由键匹配:amq.topic是通配符交换机,确保队列绑定的路由键
my/routing/key与发布者使用的主题完全一致,避免使用通配符导致不匹配。 - 排查队列排他性:若创建队列时设置了
exclusive=true,仅创建该队列的连接可访问,HAProxy轮询到其他节点的订阅者连接将无法读取队列消息,表现为队列空。需改为非排他队列。
- 确认发布者的QoS级别:若使用QoS 0,且订阅者未提前在线,RabbitMQ MQTT插件默认不会将消息留存到绑定队列。需开启消息留存(发布时设置
解决HAProxy轮询的节点一致性问题
- 若
myqueue未配置为镜像队列,发布者连接的节点会存储消息,而订阅者被转发到其他节点时,该节点无队列副本,自然读取不到消息。需将队列设置为镜像队列:- 进入RabbitMQ管理面板的队列详情页
- 配置镜像策略,设置
ha-mode=all(同步到所有节点)或对应节点组模式 - 重启队列或节点使配置生效
- 若
验证MQTT插件的交换机配置
- 确认MQTT插件默认使用
amq.topic作为转发交换机,执行命令查看配置:
若返回值不是rabbitmqctl eval 'application:get_env(rabbitmq_mqtt, exchange).'{ok, <<"amq.topic">>},需修改rabbitmq.conf添加:
之后重启所有RabbitMQ节点。mqtt.exchange = amq.topic
- 确认MQTT插件默认使用
检查订阅者的订阅逻辑
- 确认订阅者订阅的主题是
my/routing/key,无拼写错误。 - 匹配发布者与订阅者的QoS级别:若发布者用QoS 1,订阅者用QoS 0,可能因消息确认机制不匹配导致消息被丢弃。
- 确保订阅者在发布者发送消息前完成订阅,QoS 0消息不会为离线订阅者留存。
- 确认订阅者订阅的主题是
排查死信队列的消息流转
- 查看
myqueue是否配置了死信交换机,若消息因队列满、过期等原因被拒收,会被转发到死信队列。可在RabbitMQ管理面板的死信队列中检查是否存在目标消息。
- 查看
内容的提问来源于stack exchange,提问作者Francesco Carli
相关产品推荐
相关产品推荐

