想问一下,离线队列是会堆积在内存么,如果配置了持久化,什么情况在内存,什么情况落到磁盘?
如果没开启 durable_sessions.enable,离线消息队列主要在内存;开启后(并且会话过期间隔 > 0),离线消息会进入持久存储(磁盘)。
按这 3 种情况看:
-
会话过期间隔 = 0
客户端一断开,会话(订阅和未送达消息)就直接丢弃,不会保留离线队列。 -
会话过期间隔 > 0,
durable_sessions.enable = false(默认常见)
这是 regular session,状态在节点内存里。离线未送达消息放在会话内存队列(mqueue),受mqtt.max_mqueue_len限制;mqtt.mqueue_store_qos0控制是否把 QoS0 也放进离线队列。 -
会话过期间隔 > 0,
durable_sessions.enable = true(v5.7+)
这是 durable session,会话状态和消息写入 DS(RocksDB)到磁盘,并做副本复制。离线消息不再主要依赖单节点内存队列,节点重启后也能恢复。
补一条容易混淆的:即使开了持久会话,在线连接期间依然会有运行时内存(进程邮箱、inflight 窗口等),只是“离线积压消息”的主存储从内存队列变成了持久存储。
好的,感谢回复,再请问下5.8.6的开源版本是否支持durable_sessions.enable = true?需要企业版吗?
要企业版。
