本文介绍使用微消息队列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被消费者订阅过,消费者离线后,若设置了离线消息,这些离线消息会在消费者再次上线后被消费到。