【第二章09】MQTT会话

发布时间:2026/7/31 22:19:59
【第二章09】MQTT会话 MQTT 会话是 MQTT 协议中用于维持客户端与服务端之间通信状态的核心机制它不局限于网络连接存活的时间段内还可以在客户端和服务端的多次连续网络连接之间延续以此保障网络波动场景下的通信连续性避免消息丢失、重复订阅等问题。了解会话核心作用避免网络中断后客户端需要重复订阅主题的额外开销重连后可直接恢复之前的订阅关系缓存客户端离线期间发布的符合要求的消息客户端重连后可自动接收这些离线消息保障 QoS 1、QoS 2 级别的消息在网络异常场景下的可靠交付不会因为连接断开丢失传输状态会话存储的核心数据会话状态由客户端和服务端共同维护客户端侧‌记录已发送到服务端但未完成确认的 QoS 1、QoS 2 消息以及已从服务端接收但未完成确认的 QoS 2 消息服务端侧‌记录客户端的订阅信息、未送达的 QoS 1/QoS 2 消息、已发送但未确认的消息以及遗愿消息、遗愿延迟间隔等附加状态关键配置参数不同 MQTT 版本的会话配置逻辑有明显区别MQTT 3.1.1 版本‌仅通过 Clean Session 标志位控制会话生命周期Clean Session true会话生命周期和网络连接完全绑定连接断开后所有会话数据立即销毁属于非持久会话Clean Session false创建持久会话连接断开后服务端会保留会话状态多数实现中默认最长保留3天MQTT 5.0 版本‌将会话控制拆分为两个独立参数灵活性大幅提升Clean Start取值为0时服务端会尝试恢复该客户端ID对应的历史会话取值为1时直接丢弃所有历史会话创建全新会话Session Expiry Interval精确控制连接断开后会话的保留时长单位为秒设置为0时连接断开会话立即销毁设置为大于0的数值时会话会在断开对应时长后过期销毁设置为最大值0xFFFFFFFF时会话永久不过期两种典型会话类型临时会话‌会话状态完全存储在服务端内存中拥有极高的吞吐量和极低的分发延迟但服务端节点重启后会话数据会全部丢失适合不需要保留历史状态、追求低延迟的场景。持久会话‌服务端会将会话状态和消息持久化存储到磁盘还可通过集群副本实现数据冗余即使服务端节点重启也能完整恢复会话大幅提升系统可靠性适合对消息不丢有强要求的物联网场景。常见使用场景移动端智能家居、即时通讯类应用设置较长的会话保留时长用户App后台断网重连后可直接接收离线期间的通知无需重新订阅批量OTA固件升级场景设备可能处于断网、重启状态持久会话可以保证设备上线后自动收到升级指令无需运维人员反复重发低功耗水表、燃气表类设备设置会话立即过期设备断连后不保留无用状态节省服务端资源实时数据看板类设备使用非持久会话仅关注当前实时数据不需要接收历史离线消息会话演示(为离线客户端缓存消息)先关闭自动恢复订阅功能新疆一个订阅的客户端假设订阅一个topictest/a发布者客户端打开向topictest/a发送消息断开订阅客户端依旧向topic(test/a)发送了2条消息我们讲订阅者这边的clean start设置为0 会话设置永不过期看看是不是能够延续之前的会话接收到前面发布的2条消息结果发现获取到了发布的消息Topic:test/aQoS:0{msg:hello world wellcome}Topic:test/aQoS:0{msg:hello world wellcome to you}总结MQTT 会话可以为离线客户端缓存消息的能力MQTT 会话是怎么为离线客户端缓存消息的MQTT 会话为离线客户端缓存消息核心是依托‌持久会话机制‌实现的只有提前配置了持久会话的客户端服务端才会在其离线期间保留订阅关系、缓存符合规则的消息待客户端重连后自动推送完整的缓存流程和细节可以拆解为以下几个部分一、缓存生效的前置条件服务端不会默认对所有客户端开启离线消息缓存必须同时满足几个核心规则缓存逻辑才会启动‌会话模式配置正确‌MQTT 3.1.1 版本中客户端连接时必须将 Clean Session 设置为 false告知服务端在连接断开后不要销毁会话状态MQTT 5.0 版本中客户端需要将 Clean Start 设置为 false同时配置非0的 Session Expiry Interval指定会话断开后的保留时长避免会话被提前回收‌订阅与发布的消息等级达标‌客户端必须以 QoS 1 或 QoS 2 等级订阅目标主题同时发布方也以 QoS 1 或 QoS 2 等级发布消息服务端才会将这类消息纳入离线缓存队列QoS 0 等级的消息默认不做离线缓存仅部分服务端支持可选缓存配置‌客户端标识唯一‌服务端通过客户端的 Client ID 唯一识别对应会话必须保证同一客户端的标识全程不变否则无法关联到历史缓存的离线消息二、服务端的缓存存储逻辑当客户端离线后服务端会基于已保存的持久会话状态完成消息的识别和存储首先依托会话中留存的客户端订阅列表识别所有该客户端关注的主题当有新消息发布到这些主题时直接将消息写入该客户端专属的离线消息队列缓存的内容不仅包含离线期间新产生的消息还会同步保留此前客户端在线时已经发送但未完成确认的 QoS 1/QoS 2 消息以及预先配置的遗愿消息存储模式分为两类临时会话将消息暂存在内存中读写速度快但服务端重启后数据会丢失持久化存储会将会话元数据和离线消息写入磁盘甚至通过集群副本实现冗余即使服务节点重启也不会丢失缓存内容仅会带来轻微的延迟提升三、缓存的生命周期管理离线消息的缓存不会永久保留会严格跟随会话的生命周期执行回收逻辑MQTT 3.1.1 版本中默认在客户端断开连接后会话和对应的离线消息最多保留3天超时后自动全部回收MQTT 5.0 版本中完全由客户端配置的 Session Expiry Interval 决定缓存时长设置为0时连接断开缓存立即销毁设置为最大值时会话和消息可永久保留当缓存队列达到服务端预设的长度上限时会按照配置的溢出策略丢弃旧消息优先保留最新的离线消息避免占用过多系统资源四、客户端重连后的推送流程当客户端重新建立连接时服务端会先校验客户端标识匹配到对应的历史持久会话后直接返回 Session Present 标识告知客户端会话已恢复无需重新发起主题订阅随后立即将队列中所有缓存的离线消息按照预设的 QoS 等级依次推送给客户端推送完成后同步更新消费进度后续继续正常转发实时消息。