我的mqtt协议和emqttd开源项目个人理解(11) - EMQ 一个客户链接的资源消耗

简介: 我的mqtt协议和emqttd开源项目个人理解(11) - EMQ 一个客户链接的资源消耗

Erlang进程消耗

EMQ对客户端链接使用链接进程(emqtt_client)和session进程(emqtt_session)分开的策略。 当一个mqtt的客户端连接到EMQ的服务器上的时候,首先会建立一个负责管理连接的进程(emqtt_client),当验证客户端有效后会建立另一个进程(emqtt_session),负责该客户端的会话。


在EMQ中,每一个clientID只能登录一次,因此后登录的客户端会将先登录的客户端踢下线。


主要内存消耗(一个connection大约占10K内存)

数据表

当一个客户端成功完成了验证,EMQ会在mqtt_session中添加一个表项目,同时会在mqtt_local_session和mqtt_client这两张ets表中添加表项目。


进程上下文

链接进程(emqtt_client)负责接收客户端发来的数据和接受服务器内部要发送给客户端的数据,并使用编解码器进行编解码,因此链接进程的上下文消耗,主要取决接收到的数据包大小和将要发送的数据包大小和数量。


session进程(emqtt_session)会保持一个inflight队列,用来对QoS大于0的消息进行应答等待,默认会保存32个消息在等待应答,如果超过这个量级就会放入等待队列。因此session进程(emqtt_session)的主要内存消耗,取决于多少等待应答的消息,以及这些需要应答消息的数据包的大小。


主要CPU消耗

定时器

链接进程(emqtt_client),默认会启动一个心跳定时器,定期的检查链接是否存活。session进程(emqtt_session)同样会开启一个重新发送定时器,用来检查QoS大于0的消息的infligt响应,当客户端发布QoS为2的消息时还会开启另外一个定时器,用来检测REPL信息的响应,当然session进程(emqtt_session)有可能会在客户端离线后保持一段时间,因此在这段时间会建立一个超时退出的定时器。因此session进程(emqtt_session)在某一个时刻会同时存在三个定时器。


监控

session进程(emqtt_session)为了发现链接进程的退出,会建立一个针对链接进程的监控。而在客户端上线成功后后在向mqtt_local_session和mqtt_client这两张ets表中添加项目的时候,会分别建立两个监控,用来监控session进程(emqtt_session)和链接进程(emqtt_client)的退出。


进程消息

因为EMQ使用了链接进程(emqtt_client)和session进程(emqtt_session)分开的策略,因此产生进程消息传递是无法避免的。因为session进程(emqtt_session)会负责接收服务器发送给客户端的消息,并进行预先处理,处理完之后再交付给链接进(emqtt_client)程进行发送。


当使用持久化session的时候,session进程(emqtt_session)的查找和恢复时也会产生大量的进程消息。


总结

从上面的介绍中,可以看出,在部署一个EMQ服务器前需要考虑,一个客户端平均消息的量级,QoS占比和数据包大小,同时根据有多少客户端进行CPU频率和数量的选择(参考Actor模型中的调度部分)。


当运营一个EMQ服务器的时候,如果在消息量级和客户端数量没有明显变化的情况下,CPU突然飙升,就要去考虑下是否出现客户端频繁上下线的情况。当然这只是一个简单的例子,还有很多情况在此就不一一列举了。


相关实践学习
快速体验阿里云云消息队列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
相关文章
|
3月前
|
数据采集 传感器 监控
Modbus 与 MQTT 协议兼容:MyEMS 的泛在能源数据采集技术实现
MyEMS深度融合Modbus与MQTT协议,破解能源数据采集中协议碎片化、网络异构、数据孤岛等难题。通过Modbus接入95%以上工业设备,实现现场数据精准“拉取”;依托MQTT构建高效物联网传输通道,支持多源数据主动“推送”与云端集成。边缘侧采集规整,中心侧汇聚分析,形成统一、可靠、低延迟的数据流。该架构兼具高兼容性、强扩展性与低运维成本,广泛应用于工业园区、商业楼宇及集团型企业,支撑实时监控、AI分析与跨系统融合,打造泛在互联的能源数据底座,助力企业实现全面智慧能源管理。
270 6
|
10月前
|
数据可视化 关系型数据库 MySQL
嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化
通过本文的介绍,我们详细讲解了如何结合嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议,实现数据的采集、传输、存储和可视化。这种架构在物联网项目中非常常见,可以有效地处理和展示实时数据。希望本文能帮助您更好地理解和应用这些技术,构建高效、可靠的数据处理和可视化系统。
542 82
|
11月前
|
消息中间件 存储 Apache
恭喜 Apache RocketMQ、Apache Seata 荣获 2024 开源创新榜单“年度开源项目”
近日,以“新纪天工、开物焕彩——致敬开源的力量”为活动主题的“重大科技成就发布会(首场)”在国家科技传播中心成功举办,并隆重揭晓了 2024 开源创新榜单,旨在致敬中国开源力量,传播推广开源科技成就,营造中国开源创新生态。2024 年开源创新榜单由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办,中国开发者社区承办,以王怀民院士为首组建评审委员会,进行研讨评审,面向中国开源行业领域,遴选具有创新性、贡献度和影响力的开源项目、社区、应用场景与开源事件。在评审出的 10 个年度开源项目中,Apache RocketMQ、Apache Seata 成功入选。
376 104
|
6月前
|
监控 安全 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)。
983 0
|
9月前
|
消息中间件 存储 Apache
恭喜 Apache RocketMQ 荣获 2024 开源创新榜单“年度开源项目”
恭喜 Apache RocketMQ 荣获 2024 开源创新榜单“年度开源项目”
205 1
|
5月前
|
消息中间件 数据管理 Serverless
阿里云消息队列 Apache RocketMQ 创新论文入选顶会 ACM FSE 2025
阿里云消息团队基于 Apache RocketMQ 构建 Serverless 消息系统,适配多种主流消息协议(如 RabbitMQ、MQTT 和 Kafka),成功解决了传统中间件在可伸缩性、成本及元数据管理等方面的难题,并据此实现 ApsaraMQ 全系列产品 Serverless 化,助力企业提效降本。
|
3月前
|
消息中间件 Java Kafka
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
本文深入解析了 Kafka 和 RabbitMQ 两大主流消息队列在 Spring 微服务中的应用与对比。内容涵盖消息队列的基本原理、Kafka 与 RabbitMQ 的核心概念、各自优势及典型用例,并结合 Spring 生态的集成方式,帮助开发者根据实际需求选择合适的消息中间件,提升系统解耦、可扩展性与可靠性。
222 1
消息队列比较:Spring 微服务中的 Kafka 与 RabbitMQ
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
845 94
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
362 103
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。