MQTT 会话持久化
什么是 MQTT 会话持久化?
MQTT 会话持久化是一种功能,允许 MQTT 客户端在断开与代理的连接时保持其会话状态和消息队列。这确保了发送给离线客户端的消息能够被保留,并在客户端重新连接时进行投递。
何时使用 MQTT 会话持久化?
会话持久化在以下场景中特别有用:
- 可靠消息投递:需要确保客户端临时离线时消息不会丢失
- 间歇性连接:客户端在不稳定网络环境中运行
- 移动应用程序:移动设备经常在网络间切换或进入睡眠模式
- 物联网设备:物联网设备可能功率有限且连接不稳定
- 关键业务应用:消息丢失不可接受的应用
会话持久化的特性
RobustMQ 中的默认持久化
与许多 MQTT 代理不同,RobustMQ MQTT 默认启用会话持久化。会话数据自动存储在 Meta Service 中,提供:
- 自动会话管理:无需额外配置
- 高可用性:会话数据在 Meta Service 节点间复制
- 持久消息队列:消息存储直到客户端重新连接
- 会话状态保持:订阅信息和 QoS 设置得到维护
关键特性
- Clean Start = false:客户端必须设置
Clean Start = false
以保持持久会话 - 客户端 ID 要求:持久会话需要唯一的客户端 ID
- 消息保留:消息根据 QoS 级别和保留策略进行保留
- 自动恢复:代理重启后会话自动恢复
通过 MQTTX 使用会话持久化
1. 使用持久会话连接
使用 MQTTX CLI 通过设置 Clean Start = false
连接持久会话:
bash
mqttx sub -t 'sensor/temperature' -i 'robustmq_client' --no-clean -h '117.72.92.117' -p 1883
2. 断开连接并验证会话持久化
断开客户端连接。会话将在 RobustMQ 的 Meta Service 中保留。您可以通过 http://117.72.92.117:8080/ 的 RobustMQ Dashboard 验证这一点。
3. 向离线客户端发送消息
在客户端离线时,向订阅的主题发布消息:
bash
mqttx pub -t 'sensor/temperature' -m '{"temperature": 25.5, "humidity": 60}' -h '117.72.92.117' -p 1883
4. 重新连接并接收队列消息
使用相同的客户端 ID 和 --no-clean
选项重新连接:
bash
mqttx sub -t 'sensor/temperature' -i 'robustmq_client' --no-clean -h '117.72.92.117' -p 1883
客户端将接收在离线期间发布的所有消息:
[2024-12-19] [10:30:15] › … 正在连接...
[2024-12-19] [10:30:15] › ✔ 已连接
[2024-12-19] [10:30:15] › … 正在订阅 sensor/temperature...
[2024-12-19] [10:30:15] › ✔ 已订阅 sensor/temperature
[2024-12-19] [10:30:15] › payload: {"temperature": 25.5, "humidity": 60}