MQTT搭配HiveMQ集群使用时客户端异常断开后队列配置重置仅收1000条消息
问题根因分析
- 最核心的原因是未配置持久会话的内存队列加载上限:HiveMQ默认对离线持久化会话设置了
<max-in-memory-queued-messages>参数,默认值为1000。你当前仅修改了<max-queued-messages>总队列上限为100000,但未调整该内存加载阈值:服务运行时所有消息都在内存中,所以首次发1900条、或者干净断开重连时都能收到全量消息;但服务重启时,每个持久会话仅会将前1000条消息加载到内存向客户端推送,超出部分保留在磁盘溢出队列中不会主动推送,因此只能收到1000条消息。 - 次要因素和HiveMQ集群的会话绑定特性有关:HiveMQ集群中客户端的持久会话会默认绑定到首次接入的节点,重启服务后会话重新加载时依旧会触发1000条的内存加载限制,和重连逻辑无关。
- 修复方案:在两个节点的
<hivemq>根配置节点下新增如下持久化配置块,调整内存加载阈值和你设置的总队列上限对齐即可:
<persistence> <client-session> <max-in-memory-queued-messages>100000</max-in-memory-queued-messages> </client-session> </persistence>
内容的提问来源于stack exchange,提问作者Kieran
相关产品推荐
相关产品推荐

