消息收發常見問題
本文介紹使用云消息隊列 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 版控制臺的實例詳情頁查看當前實例的最大規格。
若當前實例的規格不符合您的業務需求,您可以根據實際情況實例升降配。