简说MQTT--第三部分:会话、服务质量和保留消息

有时候,我们希望MQTT代理会在客户端断开连接时存储客户端的订阅和队列消息,并在客户端稍后重新联机的时候将这些消息传递给它。在MQTT的世界中,存在保留消息,QoS级别和清除会话等技术,这些都对客户端存储消息有所影响。 我们将在这篇短文中讨论它们。

清除会话

您可以选择通过指定CONNECT数据包中的“clean_session”标志来告诉代理是否应该在连接时为您存储会话信息。

如果一条客户端链接仅仅是发布消息,它不会关心代理是否记得它。但是,如果客户端连接到代理是为了订阅消息,则通过将CONNECT数据包中的“clean_session”位设置为0来使连接“持久化”,这样是便利的或必要的。如果这么设置的话,这个客户端的订阅信息和未传送给它的消息将被代理存储下来。

要将clean_session设置为false,必须使用客户端ID。

当处于连接状态的时候,想修改“clean_session”设置是不可能的。要想修改它,你需要用新的设置来重连代理。

服务质量

不是所有“持久化”的连接上的消息都将被存储。QoS级别也会对其产生影响。

MQTT协议只保证具有QoS 1或QoS 2级别的消息确实传送给订阅者。对于那些QoS 0级别的消息,MQTT尝试发送它们一次,但是不保证一定送达。遵循这个原则,当用户断开连接时,即使这个连接是“持久化”的,也只有QoS 1和QoS 2级别的消息被存储。

值得注意的是,MQTT并不使用端到端的QoS,这意味着这些消息只有在用QoS != 0 发布并且用QoS != 0 订阅的情况下才被存储。

保留消息

如果您发布的MQTT消息的’retain’位设置为1,则它可以被保留在代理上,当订阅者连接到代理后,保留的消息会传递给它。

这是一个有用的特性,只有“保留”这个词有时令人困惑。它不保留相同主题的所有消息。 对于每个主题,只保留上次发布的消息,而较早的消息则由其后续消息替换掉。此外,’retain’标志设置为0的消息不会替换相同主题的保留消息,只有保留的消息替换保留的消息。

一个使用保留消息的场景:

一个传感器测量一个房间的温度并且每个小时将数据更新到系统中。如果温度数据用保留消息的方式发布到系统中,则无论什么时候,客户端连接到代理的时候只收到一份有用的数据,它不需要等待它不需要等待一段很长时间来等待新的数据发布,并且它也不会遭受大量无用而且过期数据的冲击。

注意:保留的消息不属于任何会话。不管“clean_session”标志如何设置,保留消息都被保留。此外,它在会话结束时也被保留。

 

*原文链接https://medium.com/@emqtt/mqtt-in-a-nutshell-2040b244aa4b