【第二章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/7/31 22:20:01 阅读更多 →
如何利用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/7/31 22:20:01 阅读更多 →
Obsidian插件汉化终极指南:3分钟实现全中文界面的秘诀

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

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

2026/7/31 22:19:00 阅读更多 →

最新新闻

CTF流量分析神器:CTF-NetA终极使用指南

CTF流量分析神器:CTF-NetA终极使用指南

CTF流量分析神器:CTF-NetA终极使用指南 【免费下载链接】CTF-NetA CTF-NetA是一款专门针对CTF比赛的网络流量分析工具,可以对常见的网络流量进行分析,快速自动获取flag。 项目地址: https://gitcode.com/gh_mirrors/ct/CTF-NetA 在CTF…

2026/7/31 22:56:12 阅读更多 →
Kmeans算法在图像分割中的应用与优化实践

Kmeans算法在图像分割中的应用与优化实践

1. 项目概述:基于Kmeans的图像分割算法软件设计这个毕业设计项目选择了一个非常实用的方向——利用Kmeans聚类算法实现图像分割功能。作为一名计算机视觉方向的从业者,我深知图像分割在医疗影像、自动驾驶、工业检测等领域的重要性。Kmeans算法虽然简单&…

2026/7/31 22:56:12 阅读更多 →
5分钟快速上手Teable:AI原生无代码数据库的完整入门指南

5分钟快速上手Teable:AI原生无代码数据库的完整入门指南

5分钟快速上手Teable:AI原生无代码数据库的完整入门指南 【免费下载链接】teable ✨ AI Spreadsheet for Business 项目地址: https://gitcode.com/GitHub_Trending/te/teable Teable是一款将AI工作流、无代码数据库和自定义应用构建完美融合的开源平台。它让…

2026/7/31 22:56:12 阅读更多 →
通达信缠论分析插件ChanlunX:让复杂技术分析从手动绘制走向智能识别

通达信缠论分析插件ChanlunX:让复杂技术分析从手动绘制走向智能识别

通达信缠论分析插件ChanlunX:让复杂技术分析从手动绘制走向智能识别 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经面对复杂的K线走势图,需要手动识别顶底分型、连接笔…

2026/7/31 22:56:12 阅读更多 →
三步解锁百度文库:免费下载完整文档的终极指南

三步解锁百度文库:免费下载完整文档的终极指南

三步解锁百度文库:免费下载完整文档的终极指南 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 还在为百度文库的下载限制而烦恼吗?想要轻松获取那些宝贵的学习资料和工作文…

2026/7/31 22:56:12 阅读更多 →
AVRDUDESS:让AVR编程变得像点按钮一样简单

AVRDUDESS:让AVR编程变得像点按钮一样简单

AVRDUDESS:让AVR编程变得像点按钮一样简单 【免费下载链接】AVRDUDESS A GUI for AVRDUDE 项目地址: https://gitcode.com/gh_mirrors/avr/AVRDUDESS 如果你曾经为AVR微控制器的复杂烧录过程感到头疼,那么AVRDUDESS就是为你量身定制的救星。这个开…

2026/7/31 22:55:12 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻