繁体   English   中英

MQTT 代理是否支持持久订阅?

[英]Does MQTT brokers support persistent subscriptions?

我在我的第一个 IOT POC 上工作,该设备通常每小时/每天生成一次传感器数据。 我计划拥有这样的架构: - 1 个用于传感器数据输入的共享主题(设备到后端方向) - 每个设备最初都会订阅自己的特定主题,即 /device/{id}/notification

现在,在传感器数据提交到共享主题后,我打算让设备进入深度睡眠(设备只能通过 wifi 数据包或定时器唤醒),在这种状态下,与代理的 TCP 连接丢失。

问题:设备重新唤醒并重新建立与 MQTT 代理的 TCP 连接后,设备是否会收到服务器在停止服务期间生成的所有消息,或者这些消息将不可用?

在客户端连接到代理期间, CleanSession标志使代理能够将丢失的 QoS 1 或 QoS 2 消息排队(存储 QoS 0 消息取决于实现)。

MQTT 3.1.1 标准Section 3.1.2.4规定:

如果 CleanSession 设置为 0,则服务器必须根据当前会话的状态(由客户端标识符标识)恢复与客户端的通信。 如果没有与客户端标识符关联的会话,服务器必须创建一个新的会话。 在客户端和服务器断开连接后,客户端和服务器必须存储会话 [MQTT-3.1.2-4]。 在 CleanSession 设置为 0 的会话断开连接后,服务器必须存储进一步的 QoS 1 和 QoS 2 消息,这些消息与客户端在断开连接时拥有的任何订阅相匹配,作为会话状态的一部分 [MQTT-3.1.2- 5]。 它还可以存储满足相同标准的 QoS 0 消息

持久会话的问题在于它可能会将大量消息排队,因此在重新连接时,客户端会被丢失的消息轰炸。 如果您需要知道完整的读数序列,这可能是可取的,或者如果客户端在低功耗、电池供电的嵌入式设备上运行,则这可能是非常不受欢迎的。

为了解决这个问题,MQTT 提供了另一个特性:在发布消息中retained标志。

MQTT 3.1.1 标准第 3.3.1.3 节规定:

如果 RETAIN 标志设置为 1,则在客户端发送给服务器的 PUBLISH 数据包中,服务器必须存储应用消息及其 QoS,以便可以将其传递给订阅与其主题名称匹配的未来订阅者 [MQTT- 3.3.1-5]。 当建立新订阅时,必须将每个匹配主题名称上最后保留的消息(如果有)发送给订阅者 [MQTT-3.3.1-6]。 如果服务器收到一个 QoS 0 消息,并且 RETAIN 标志设置为 1,它必须丢弃先前为该主题保留的任何消息。 它应该将新的 QoS 0 消息存储为该主题的新保留消息,但可以随时选择丢弃它 - 如果发生这种情况,该主题将没有保留消息

这确保在重新连接时,客户端仅收到有关给定主题的最新消息。

很快,我自己找到了答案。 持久会话是答案。 我一直在寻找持久订阅,但最初并没有成功......

这是关于我的案例的最后一篇很棒的文章: http : //www.hivemq.com/blog/mqtt-essentials-part-7-persistent-session-queuing-messages

所以是的,持久订阅称为持久会话,是的,这是可能的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM