Skip to content

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}