【第二章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 等级依次推送给客户端推送完成后同步更新消费进度后续继续正常转发实时消息。

相关新闻

【物联网基础02】了解TCP/IP协议族

【物联网基础02】了解TCP/IP协议族

TCP/IP协议族并非单一的两个协议,而是一套由上百个分层协作的协议共同组成的互联网核心通信体系,它是实现不同厂商、不同操作系统、不同物理网络设备之间互联互通的通用标准,从诞生之初就被设计用来解决异构网络的互联问题,是现代…

2026/10/5 10:56:14 阅读更多 →
如何利用MLX框架实现高效文本转语音:Dots-TTS-INT8量化技术深度解析

如何利用MLX框架实现高效文本转语音:Dots-TTS-INT8量化技术深度解析

如何利用MLX框架实现高效文本转语音:Dots-TTS-INT8量化技术深度解析 【免费下载链接】dots-tts-mlx-int8 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/dots-tts-mlx-int8 探索AI语音合成的新境界,Dots-TTS-MLX-INT8项目为我们展…

2026/10/10 1:53:03 阅读更多 →
Obsidian插件汉化终极指南:3分钟实现全中文界面的秘诀

Obsidian插件汉化终极指南:3分钟实现全中文界面的秘诀

Obsidian插件汉化终极指南:3分钟实现全中文界面的秘诀 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 还在为Obsidian英文插件界面而烦恼吗?每次配置插件都要查词典,专业术语看不懂&…

2026/10/8 11:18:36 阅读更多 →

最新新闻

HyperQwen 上下文复述加速:lookup 草稿如何把 25k 文档复读推到 381 tok/s

HyperQwen 上下文复述加速:lookup 草稿如何把 25k 文档复读推到 381 tok/s

HyperQwen 上下文复述加速:lookup 草稿如何把 25k 文档复读推到 381 tok/s 【免费下载链接】HyperQwen Serve large Qwen models fast on the GPUs you actually own. Qwen3.8-27B on a single 24 GB card with vLLM: 127 tok/s single-user (381 when the answer q…

2026/10/11 20:40:27 阅读更多 →
Android手势识别全解:从MotionEvent到自定义模板匹配

Android手势识别全解:从MotionEvent到自定义模板匹配

从第一次接触Android开发到现在,我一直觉得手势识别是最能体现“交互感”的一块内容。你辛辛苦苦写了个很酷的交互逻辑,结果用户手指一滑、一按、一捏,完全没反应,那种挫败感真的很难受。反过来,如果把手势识别处理好&…

2026/10/11 20:40:27 阅读更多 →
HTML5语义化标签实战:告别div盘丝洞,构建清晰网页骨架

HTML5语义化标签实战:告别div盘丝洞,构建清晰网页骨架

很多前端新手拿到设计稿,第一反应永远是 div。一个 div 包一层,不够再套一个 div,最后变成了一层叠一层的“div 盘丝洞”。我自己早期也这么写过,直到后来接手一个老项目,光是梳理页面结构就花了整整一下午&#xff0c…

2026/10/11 20:40:27 阅读更多 →
函数调用底层机制解析:从栈帧到调用约定与调试实践

函数调用底层机制解析:从栈帧到调用约定与调试实践

函数调用,听起来是个基础得不能再基础的话题。但这些年我见过不少线上事故和疑难杂症,根子都埋在这一层:代码换了个编译器行为就变了、高并发下偶发崩溃、调试器里看到的变量值莫名其妙被改写、递归一深就栈溢出。这些问题不搞清楚函数调用背…

2026/10/11 20:40:27 阅读更多 →
函数调用底层原理与调试实战:栈帧、调用约定、栈溢出

函数调用底层原理与调试实战:栈帧、调用约定、栈溢出

函数调用的核心原理与技巧,这个话题听起来像教科书里才能翻到的冷知识,但平时排查崩溃、分析性能、甚至看懂一条报错栈信息时,靠的全是它。凡是写过几年代码的人,多少都遇到过这种场景:运行好好的程序换了个编译器版本…

2026/10/11 20:40:27 阅读更多 →
scale_up协议光链路可靠性设计:从感知到自愈的全栈协同

scale_up协议光链路可靠性设计:从感知到自愈的全栈协同

1. 项目概述:光链路可靠性不是“加个备份”就能解决的事“scale_up协议中针对光链路的可靠性设计”——这个标题乍看是通信协议层的技术细节,但背后牵动的是整个高速互连系统的命脉。我接触过多个采用scale_up架构的高性能计算集群项目,其中超…

2026/10/11 20:39:26 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →