本文介绍使用云消息队列 MQTT 版进行消息收发时的常见问题。
发送线程卡住的可能原因有哪些?
可能原因:在接收消息的回调方法中直接发送 QoS=1 的消息,可能导致线程阻塞,进而影响心跳发送。
解决方案:将消息发送改为异步方式,或将 QoS 级别改为 0。
MQTT 消息未被消费的可能原因有哪些?
检查该 Topic 的通配符订阅数量。每个一级 Topic 下的通配符订阅不能超过 100 个,超出上限后新增的订阅将无法生效,从而导致消息无法被消费。
若 Topic 从未被订阅过,请确认消费者是否先于生产者启动。
若 Topic 曾被订阅过,请确认 CleanSession 是否设置为 false。注意:QoS 2 不支持 CleanSession=false。
离线消息和实时消息的消费是否有先后顺序?
消费者上线后,离线消息和实时消息之间的消费顺序不作保证。
MQTT消息重试的时间间隔是多久?
消息重试间隔为3~6秒。
MQTT转发到Kafka未接收到消息是什么原因?
可能有以下原因:
1. 转发规则中的SQL未能匹配消息内容,请检查SQL语句是否正确。
2. MQTT转发到Kafka对消息体格式有要求,消息体必须是Key-Value格式的JSON。
3. 通过MQTT快速体验功能或OpenAPI发送的消息不支持规则转发,建议使用官方SDK发送消息。
为什么消息不能由云端生产并由云端消费?
云端SDK不支持消费由云端SDK自身生产的消息,此行为属于产品设计限制。云端SDK的设计定位是接收终端设备上报的消息,而非用于云端之间的消息通信。
配置MQTT流出规则到RocketMQ后为什么收不到消息?
MQTT流出规则到 RocketMQ 存在以下限制:
从MQTT流出到 RocketMQ 的消息ID保持不变。
通过服务端方式(如云端SDK、HTTP)生产的消息不会流出到 RocketMQ,只有终端设备发送的消息才会通过流出规则流转到 RocketMQ。
消息的msgId为什么为空?
msgId为空可能由以下原因导致:
消息体大小超过限制。
内部RPC调用超时。建议客户端实现退避重试机制。
为什么会出现一条消息同一时间重试多次?
问题现象:同一条消息同一时间被重复推送了多次。

可能原因:TCP连接写数据被阻塞,TCP连接恢复写数据后多条重试推送数据会同一时间写入,所以看到推送时间都一样。实际重试消息都是间隔产生的,只是暂时堆在了写缓存区内,写成功后才会打印日志。
为什么消息会一直重试?
连接正常的情况下,消息会间隔5秒到10秒重试一次,超过一定次数后还失败则会被丢弃。
如果消息重试时客户端连接已经断开,则消息不会进行sendback,重试次数不会增加,消费位点也不会提交,消息仍被保存在队列中。下次连接时客户端会拉取离线消息。如果客户端频繁闪断,则消息将一直不断被拉取重复推送且不会丢弃。
消息发送时提示GroupID没有权限
若您使用的账号为RAM用户,您需要给RAM用户授予访问云消息队列 MQTT 版资源的权限,云消息队列 MQTT 版支持授予实例、Topic和Group级别的权限。更多信息,请参见RAM主子账号授权。
使用RocketMQ数据流入MQTT功能时,为什么子级Topic后会多了一个“/”?
问题现象:使用数据流入规格将云消息队列 RocketMQ 版的数据流入至云消息队列 MQTT 版时,通过mqttSecondTopic属性设置了云消息队列 MQTT 版的子级Topic,消息发送后,子级Topic后会多一个“/”。
可能原因:服务端会对Topic名称进行规范化,默认以“/”结尾。
消息发送返回“Too many publishes in progress”错误
您的消息发送TPS过大,超过上限值。您可以适当调整实例规格,提高消息收发TPS上限。
发送消息后,即使设置了离线消息,也无法收到消息
您需要先启动消费者,再启动生产者生产消息。
若先启动生产者发送消息,如果Topic从未有过订阅,则即使设置了离线消息(QoS=1且cleanSession=false),消费者启动后也不会收到离线消息;如果Topic被消费者订阅过,消费者离线后,若设置了离线消息,这些离线消息会在消费者再次上线后被消费到。
为什么客户端消费时部分Topic的消息接收不到?
云消息队列 MQTT 版对单个客户端订阅的Topic数量和订阅关系的数量均有限制,若超过最大限制,会有部分订阅关系不生效,导致对应Topic的消息接收不到。具体限制,请参见客户端限制。
使用微消息队列MQTT收发消息时是否会被限流?
云消息队列 MQTT 版的实例在客户端连接数、消息收发TPS和客户端订阅关系上都有具体规格限制,若超过了规格的最大值,消息收发会被限流。具体限制,可在云消息队列 MQTT 版控制台的实例详情页查看当前实例的最大规格。
若当前实例的规格不符合您的业务需求,您可以根据实际情况升级实例配置。