消息收发常见问题
本文介绍使用云消息队列 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 版控制台的实例详情页查看当前实例的最大规格。
若当前实例的规格不符合您的业务需求,您可以根据实际情况实例升降配。