本文介绍使用云消息队列 MQTT 版进行消息收发时的常见问题。

为什么会出现一条消息同一时间重试多次?

问题现象:同一条消息同一时间被重复推送了多次。

消息重试

可能原因: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 版控制台实例详情页查看当前实例的最大规格。

若当前实例的规格不符合您的业务需求,您可以根据实际情况升级实例配置