MQTT 保留消息

什么是 MQTT 保留消息?
发布者发布消息时, 如果 Retained 标记被设置为 true, 则该消息即是 MQTT 中的保留消息(Retained Message) 。 MQTT 服务器会为每个主题存储最新一条保留消息, 以方便消息发布后才上线的客户端在订阅主题时仍可以接收到该消息。

何时使用 MQTT 保留消息?
发布订阅模式虽然能让消息的发布者与订阅者充分解耦, 但也存在一个缺点, 即订阅者无法主动向发布者请求消息。 订阅者何时收到消息完全依赖于发布者何时发布消息, 这在某些场景中就产生了不便。
借助保留消息, 新的订阅者能够立即获取最近的状态, 而不需要等待无法预期的时间, 例如:

  • 智能家居设备的状态只有在变更时才会上报, 但是控制端需要在上线后就能获取到设备的状态;
  • 传感器上报数据的间隔太长, 但是订阅者需要在订阅后立即获取到最新的数据;
  • 传感器的版本号、 序列号等不会经常变更的属性, 可在上线后发布一条保留消息告知后续的所有订阅
    者。

MQTT 保留消息的使用
若要使用 MQTT 保留消息, 只需在消息发布时将 Retained 状态设置为 true 即可。

如何判断一条消息是否是保留消息?
当客户端订阅了有保留消息的主题后, 即会收到该主题的保留消息, 可通过消息中的保留标志位判断是否是保留消息。 需要注意的是, 在保留消息发布前订阅主题, 将不会收到保留消息。 需要待保留消息发布后,重新订阅该主题, 才会收到保留消息。

保留消息将保存多久? 如何删除?
服务器只会为每个主题保存最新一条保留消息, 保留消息的保存时间与服务器的设置有关。 若服务器设置保留消息存储在内存, 则 MQTT 服务器重启后消息即会丢失; 若存储在磁盘, 则服务器重启后保留消息仍然存在。
保留消息虽然存储在服务端中, 但它并不属于会话的一部分。 也就是说, 即便发布这个保留消息的会话已结束, 保留消息也不会被删除。 删除保留消息有以下几种方式:

  • 客户端往某个主题发送一个 Payload 为空的保留消息, 服务端就会删除这个主题下的保留消息;
  • 在 MQTT 服务器上删除, 比如 EMQX MQTT 服务器提供了在 Dashboard 上删除保留消息的功能;
  • MQTT 5.0 新增了消息过期间隔属性, 发布时可使用该属性设置消息的过期时间, 不管消息是否为保留消息, 都将会在过期时间后自动被删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ryan爱吃糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值