持久化会话和队列消息 - MQTT核心:第七章

持久化会话和队列消息 - MQTT核心:第七章

作者:HiveMQ Team

翻译:索隆有几把刀

欢迎来到MQTT核心系列的第七章。这个系列一共有十章,用来介绍MQTT的核心特性和概念。在这一章中,我们将讨论持久化会话和在MQTT中的消息队列。虽然按照定义,MQTT不是一个消息队列,但是它能为客户端将消息入列。我们将为你展示如何做到这点。

持久化会话

为了接受从代理来的消息,客户端会连接代理并订阅感兴趣的主题。假如客户端和代理是非持久化会话,那么一旦客户端与代理之间的连接中断,当客户端重新连接后,也需要重新订阅之前订阅的主题。在每次重新连接后,客户端都需要重新订阅,这对资源受限的小型机是一个不小的负担。为了避免这个问题,客户端可以在它连接代理的时候请求持久化会话。持久化会话能将与客户端相关的所有信息都保存在代理上面。代理通过客户端连接时提供的cientId来标志会话。

持久化会话保存了什么?

在一个持久化会话中,代理会保存如下信息(即使这个客户端离线了)。当客户端重新连接后这些信息就会立即生效:

  • 一个会话(即使没有任何订阅信息)
  • 客户端所有的订阅信息
  • 所有服务质量为1或者2且客户端没有确认的消息
  • 所有客户端离线期间的服务质量为1或者2的消息
  • 从客户端接收到的所有尚未确认的服务质量为2的消息

如何开启或者结束持久化会话

当客户端连接代理的时候,客户端可以请求持久化会话。客户端使用cleanSession这个标识符来告诉代理,它需要什么类型的会话:

  • 当cleanSession被设置为true的时候,表示客户端不需要持久化会话。那么当客户端因为任何原因断开连接的时候,那么包括原先持久化会话保存的信息都会被代理丢弃。
  • 当cleanSession被设置为false的时候,代理会为客户端创建持久化会话。所有的信息和消息都会被持久化,直到客户端请求cleanSession为true。如果cleanSession标志被设置为false且已经存在会话,那么代理会使用原先的会话,并且把队列里的消息发送给客户端。

关于连接建立的更详细信息可以去看看这个系列的第三章。

客户端如何知道是否已经存在一个会话?

自从MQTT3.1.1,从代理返回的CONNACK消息会包含一个持久会话的标志。这个标志会告诉客户端原先存在的会话时候依然有效。

关于连接建立的更详细信息可以去看看这个系列的第三章。

客户端侧的持久化会话

与代理类似,每一个MQTT客户端必须保存一个持久化会话。当一个客户端请求代理去持有会话信息的时候,客户端应该存储如下消息:

  • 所有发往代理的服务质量为1或者2的消息在没有得到代理确认前,应该被存储起来。
  • 所有来至代理的服务质量为2的消息在没有完成确认前,应该被春初起来。

最佳实践

以下是一些指导方针,能帮助你决策是否应该使用持久化会话

持久化会话

  • 客户端必须接受特定主题的所有消息,即使客户端离线了。你想代理把消息入列存储,当客户端上线后,立即把消息推送给客户端。
  • 客户端资源受限。你想代理存储客户端的订阅消息,并在客户端重连后立即恢复订阅。
  • 客户端需要在重连后恢复所有服务质量为1和2的推送消息

非持久化会话

  • 客户端仅仅需要推送消息到主题,而不需要订阅主题。
  • 客户端不需要获取它离线时错过的消息

消息会被代理存储多久?

人们总是问消息会被存储多久,简单来说就是,消息会被代理存储,直至客户端重新上线,并收到消息。但是,如果客户长时间不在线会怎样? 通常,操作系统的内存限制是消息存储的主要限制。对于这种情况没有标准答案。正确的解决方案取决于您的用例。


至此,我们完成了MQTT Essentials系列的第七部分。感谢您加入我们。下周,我们将讨论保留消息的概念以及它们在MQTT中的工作方式。如果您已经尝试过MQTT,则在发送消息时可能会注意到保留标志。在我们的下一篇文章中,您可以了解所有关于它们的信息。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值