tencent cloud

消息队列 MQTT 版

动态与公告
新功能发布记录
产品简介
TDMQ 产品系列介绍与选型
什么是消息队列 MQTT 版
应用场景
技术架构
产品系列
MQTT 协议兼容说明
开源对比
高可用
产品约束与使用配额
基本概念
开服地域
购买指南
计费概述
续费说明
查看消费明细
欠费说明
退费说明
快速入门
入门流程指引
准备工作
公网接入
VPC 网络接入
用户指南
使用流程指引
配置账号权限
新建集群
管理 Topic
连接集群
查询消息
管理客户端
管理集群
查看监控和配置告警
数据集成
集成数据到云函数 SCF
集成数据到 CKafka
集成数据到 RocketMQ
开发指南
MQTT 5 高级特性
数据面 HTTP 接口说明
配置自定义域名
配置 SQL 过滤
配置点对点订阅
MQTT over QUIC
管理客户端订阅
消息增强规则
实践教程
MQTT 客户端开发注意事项
可观测能力
Topic 与通配符订阅
API 参考
History
Introduction
API Category
Making API Requests
Cluster APIs
Topic APIs
Authorization Policy APIs
User APIs
Client APIs
Message Enhancement Rule APIs
Message APIs
Data Types
Error Codes
SDK 参考
接入点格式
Java SDK
C SDK
Javascript/Node.JS/小程序
Go SDK
iOS SDK
JavaScript SDK
Dart SDK
Python SDK
.NET
安全与合规
权限管理
常见问题
相关协议
隐私协议
数据处理和安全协议
消息队列 MQTT 版服务等级协议
联系我们

会话(Session)状态管理

PDF
聚焦模式
字号
最后更新时间: 2026-01-30 15:23:29

功能介绍

会话(Session) 是 MQTT 协议中用于维持客户端与服务端之间“状态”的核心机制。通过管理会话状态,MQTT 能够确保在网络断开重连后,业务消息不丢失、订阅关系无需重建,从而保证通信的连续性和可靠性。
本文将详细阐述 MQTT 3.1.1 和 MQTT 5.0 协议中关于会话状态管理的规范、生命周期及最佳实践。

会话状态定义

在 MQTT 协议中,客户端(Client)与服务端(Server)建立连接后,即开启了一个“会话”。会话不仅存在于网络连接存活期间;根据配置,它还可以在网络连接断开后继续保留。一个持久化的会话通常包含以下数据:

订阅

持久会话将保留客户端的订阅信息:客户端再次连接后会恢复上次订阅的 Topic Filter。

消费进度

对于普通订阅:客户端再次连接后会继续上次消费进度,推送系统中最早一条未消费消息。客户端离线状态下产生的消息仍能正常消费。
对于共享订阅:消费进度随着共享组的生命周期保留。即只要该共享组中存在未过期的会话,就会保留当前的消费进度,详见配置共享订阅

会话有效期

MQTT 3.1、3.1.1 通过 clean-session 定义 Session 的生命周期。 当 clean-session = true, Session 的生命周期与传输层生命周期一致。 当 clean-session = false, Session 与传输层生命周期无关。为避免资源浪费,产品定义传输层断开后,Session 最大存续 3 天。

按照 MQTT 5.0 协议,有以下等价语义:
MQTT 3.1、3.1.1
MQTT 5
clean-session = true
clean-start = true
session-expiry-interval = 0
clean-session = false
clean-start = false
session-expiry-interval = 259200(会话保留 3 天)
超过有效期的会话将被回收,客户端下次连接时会按照首次连接进行处理。

使用场景

移动端应用与即时消息

场景描述: 运行在手机上的 App(如智能家居 App、外卖骑手端、即时通讯软件)。这类应用经常因切换后台、网络切换(4G/Wi-Fi)或屏幕熄灭而导致连接中断。用户希望在重新打开 App 时,能够立即收到离线期间错过的通知或消息。
推荐配置:
MQTT 3.1.1:Clean Session = true
MQTT 5.0:Clean Start = false, Session Expiry Interval = [较长值,如 1 天]
核心价值: 漫游不丢信。利用持久会话机制,服务端会自动缓存 App 离线期间的消息。当用户再次打开 App(重连)时,无需重新订阅 Topic,且能瞬间拉取未读消息,提供流畅的用户体验。

OTA 固件升级

场景描述: 服务端向百万台设备批量发送“升级固件”的指令。由于设备数量巨大,部分设备可能正处于断网或升级中的重启状态。
推荐配置:
MQTT 3.1.1:Clean Session = false
MQTT 5.0:Clean Start = false, Session Expiry Interval = [较长值,如 1 天]
核心价值: 异步解耦。运维人员只需发布一次升级指令,无需关心设备当前是否在线。在线的设备立即收到;离线的设备在下次上线(如重启完成或网络恢复)时收到升级指令。这避免了运维人员反复重试发送指令的痛苦。

低功耗设备

场景描述: 电池供电的设备(如水表、燃气表、农业传感器)。为了省电,设备大部分时间处于深度休眠(断网)状态,每天仅唤醒几次上报数据,随后立即断开。
推荐配置:
MQTT 3.1.1:Clean Session = true
MQTT 5.0:Clean Start = true, Session Expiry Interval = 0
核心价值: 节省资源。此类设备主要行为是“单向上传”,通常不需要接收服务端的下行指令。使用非持久会话模式,确保设备断开后不会有无用状态保留。

实时看板等信息发布设备

场景描述: 运维人员通过浏览器访问的 Web Dashboard(仪表盘)或广告屏、点餐终端、POS 机等信息发布设备。
推荐配置:
MQTT 3.1.1:Clean Session = true
MQTT 5.0:Clean Start = true, Session Expiry Interval = 0
核心价值: 即用即走。这些客户端的信息一般具有很强的时效性,并不关心历史消息。并且它们的 Client ID 通常是随机生成的(如 web_client_uuid)。关闭设备后,该 ID 不会再被使用,没有保留会话状态的必要性。

计费说明

消息队列 MQTT 版按照不同规格限制连接数,在线会话和离线的持久化会话都占用 1 个连接数。当连接数达到上限后新连接将被拒绝,详见计费概述

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈