我的mqtt协议和emqttd开源项目个人理解(25) - 协议里面Clean Session为0和1的区别

简介: 我的mqtt协议和emqttd开源项目个人理解(25) - 协议里面Clean Session为0和1的区别

一、基本概念


Session 会话


定义


定义:某个客户端(由ClientID作为标识)和某个服务器之间的逻辑层面的通信

生命周期(存在时间):会话 >= 网络连接

CleanSession 标记

在Connect时,由客户端设置

0 —— 开启会话重用机制。网络断开重连后,恢复之前的Session信息。需要客户端和服务器有相关Session持久化机制。

1 —— 关闭会话重用机制。每次Connect都是一个新Session,会话仅持续和网络连接同样长的时间。



客户端 Session

已经发送给服务端,但是还没有完成确认的 QoS 1 和 QoS 2 级别的消息

已从服务端接收,但是还没有完成确认的 QoS 2 级别的消息



服务器端 Session

会话是否存在,即使会话状态的其它部分都是空  (SessionFlag)

客户端的订阅信息  (ClientSubcription)

已经发送给客户端,但是还没有完成确认的 QoS 1 和 QoS 2 级别的消息

即将传输给客户端的 QoS 1 和 QoS 2 级别的消息

已从客户端接收,但是还没有完成确认的 QoS 2 级别的消息

(可选)准备发送给客户端的 QoS 0 级别的消息


二、关于协议的问答


问:问个mqtt协议的问题,cleansession为什么要区别0和1,他们各自的用途和应用场景是什么?


答:为 1 的时候,服务器每次session 都要重新建立,这也是大多数的场景使用情况;


为 0 的时候可以复用历史的session, 服务端session 是有状态的,可以记录很多信息。


为 0的时候就可以保留 session 了,这个保留的session 是有用的,如果服务端实现了的话,像历史没发出去的消息等等,鉴权信息,等等,可以接着使用。你可以类比我们登陆网页的那个session,没过期的话,可以不用登陆了。


说白了,想接收离线消息,就必须使用cleansession=0,这个就是=0的应用场景:


不管clean session的值是什么,当终端设备离线时,QoS=0,1,2的消息一律接收不到。

当clean session的值为1,当终端设备离线再上线时,离线期间发来QoS=0,1,2的消息一律接收不到。

当clean session的值为0,当终端设备离线再上线时,离线期间发来QoS=0,1,2的消息仍然可以接收到。如果同个主题发了多条就接收多条,一条不差,照单全收。


三、emq源码里面,hook上下线流程


1、emq v2当服务器进程重启之后,session会清除掉,没有实现本地持久化。


2、cleansession为0和1的时候,hook里面的上下线,0和1流程大不相同。相同clientid冲突登录。


以下的打印信息来自hook插件源码文件

emqttd:hook('client.connected', fun ?MODULE:on_client_connected/3, [Env]),

emqttd:hook('client.disconnected', fun ?MODULE:on_client_disconnected/3, [Env]),

emqttd:hook('session.created', fun ?MODULE:on_session_created/3, [Env]),

emqttd:hook('session.terminated', fun ?MODULE:on_session_terminated/4, [Env]),


(1)、cleansession==1的情况

场景1,客户端自身上线下线

正常上线

session(firecat_heartbeat001/firecatGTerm) created.

client firecat_heartbeat001 connected, connack: 0

正常下线

client firecat_heartbeat001 disconnected, reason: normal

session(firecat_heartbeat001/firecatGTerm) terminated: normal.


场景2,客户端先正常上线,后相同clientid客户端在别的地方又上线,造成clientid冲突

先正常上线

session(firecat_heartbeat001/firecatGTerm) created.

client firecat_heartbeat001 connected, connack: 0

后冲突上线

session(firecat_heartbeat001/firecatGTerm) terminated: {shutdown,conflict}.

session(firecat_heartbeat001/firecatGTerm) created.

client firecat_heartbeat001 connected, connack: 0

注意,冲突上线,后者会把前者挤掉,但是前者不会触发离线函数,仅仅把session毁掉重建而已.

后者正常下线

client firecat_heartbeat001 disconnected, reason: normal

session(firecat_heartbeat001/firecatGTerm) terminated: normal.



(2)、cleansession==0的情况

场景1,客户端自身第一次上线下线

正常上线

session(firecat_heartbeat001/firecatGTerm) created.

client firecat_heartbeat001 connected, connack: 0

正常下线

client firecat_heartbeat001 disconnected, reason: normal

注意,这里不销毁session

最终,session会有过期时间,时间到会销毁,时间(貌似2个小时?)详见emqttd_session.erl

session(firecat_heartbeat001/firecatGTerm) terminated: {shutdown,expired}.


场景2,客户端自身第N次(N>1)上线下线

正常上线

注意,这里不创建session

client firecat_heartbeat001 connected, connack: 0

正常下线

client firecat_heartbeat001 disconnected, reason: normal

注意,这里不销毁session

最终,session会有过期时间,时间到会销毁,时间详见emqttd_session.erl

session(firecat_heartbeat001/firecatGTerm) terminated: {shutdown,expired}.


场景3,客户端先正常上线,后相同clientid客户端在别的地方又上线,造成clientid冲突

先正常上线

session(firecat_heartbeat001/firecatGTerm) created.

client firecat_heartbeat001 connected, connack: 0

后冲突上线

client firecat_heartbeat001 connected, connack: 0

注意,冲突上线,后者会把前者挤掉,但是前者不会触发离线函数,session也不毁掉不重建.

后者正常下线

client firecat_heartbeat001 disconnected, reason: normal

注意,这里不销毁session

最终,session会有过期时间,时间到会销毁,时间详见emqttd_session.erl

session(firecat_heartbeat001/firecatGTerm) terminated: {shutdown,expired}.

 


相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
7月前
|
数据采集 传感器 监控
Modbus 与 MQTT 协议兼容:MyEMS 的泛在能源数据采集技术实现
MyEMS深度融合Modbus与MQTT协议,破解能源数据采集中协议碎片化、网络异构、数据孤岛等难题。通过Modbus接入95%以上工业设备,实现现场数据精准“拉取”;依托MQTT构建高效物联网传输通道,支持多源数据主动“推送”与云端集成。边缘侧采集规整,中心侧汇聚分析,形成统一、可靠、低延迟的数据流。该架构兼具高兼容性、强扩展性与低运维成本,广泛应用于工业园区、商业楼宇及集团型企业,支撑实时监控、AI分析与跨系统融合,打造泛在互联的能源数据底座,助力企业实现全面智慧能源管理。
497 6
|
消息中间件 存储 Apache
恭喜 Apache RocketMQ、Apache Seata 荣获 2024 开源创新榜单“年度开源项目”
近日,以“新纪天工、开物焕彩——致敬开源的力量”为活动主题的“重大科技成就发布会(首场)”在国家科技传播中心成功举办,并隆重揭晓了 2024 开源创新榜单,旨在致敬中国开源力量,传播推广开源科技成就,营造中国开源创新生态。2024 年开源创新榜单由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办,中国开发者社区承办,以王怀民院士为首组建评审委员会,进行研讨评审,面向中国开源行业领域,遴选具有创新性、贡献度和影响力的开源项目、社区、应用场景与开源事件。在评审出的 10 个年度开源项目中,Apache RocketMQ、Apache Seata 成功入选。
531 119
|
数据可视化 关系型数据库 MySQL
嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化
通过本文的介绍,我们详细讲解了如何结合嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议,实现数据的采集、传输、存储和可视化。这种架构在物联网项目中非常常见,可以有效地处理和展示实时数据。希望本文能帮助您更好地理解和应用这些技术,构建高效、可靠的数据处理和可视化系统。
797 82
|
10月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
2179 0
|
消息中间件 存储 Apache
恭喜 Apache RocketMQ 荣获 2024 开源创新榜单“年度开源项目”
恭喜 Apache RocketMQ 荣获 2024 开源创新榜单“年度开源项目”
318 1
|
数据采集 传感器 监控
多协议网关BL110钡铼6路RS485转MQTT协议云网关
BL110钡铼6路RS485转MQTT协议云网关是一款高性能、易配置的工业级设备,适用于各种需要远程监控和数据采集的物联网应用场景。通过将传统RS485设备的数据转换为MQTT协议并上传至云平台,实现了设备的远程管理和智能控制,极大地提升了系统的管理效率和响应速度。
577 2
|
网络协议 物联网 网络性能优化
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
705 5
|
消息中间件 存储 监控
ActiveMQ、RocketMQ、RabbitMQ、Kafka 的区别
【10月更文挑战第24天】ActiveMQ、RocketMQ、RabbitMQ 和 Kafka 都有各自的特点和优势,在不同的应用场景中发挥着重要作用。在选择消息队列时,需要根据具体的需求、性能要求、扩展性要求等因素进行综合考虑,选择最适合的消息队列技术。同时,随着技术的不断发展和演进,这些消息队列也在不断地更新和完善,以适应不断变化的应用需求。
1079 1
|
9月前
|
消息中间件 数据管理 Serverless
阿里云消息队列 Apache RocketMQ 创新论文入选顶会 ACM FSE 2025
阿里云消息团队基于 Apache RocketMQ 构建 Serverless 消息系统,适配多种主流消息协议(如 RabbitMQ、MQTT 和 Kafka),成功解决了传统中间件在可伸缩性、成本及元数据管理等方面的难题,并据此实现 ApsaraMQ 全系列产品 Serverless 化,助力企业提效降本。
|
7月前
|
消息中间件 Java Kafka
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
本文深入解析了 Kafka 和 RabbitMQ 两大主流消息队列在 Spring 微服务中的应用与对比。内容涵盖消息队列的基本原理、Kafka 与 RabbitMQ 的核心概念、各自优势及典型用例,并结合 Spring 生态的集成方式,帮助开发者根据实际需求选择合适的消息中间件,提升系统解耦、可扩展性与可靠性。
505 1
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ