如何发起 MQTT 亿级连接和千万消息吞吐性能测试
简介:MQTT 协议凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山。
作者:亦炎
随着 5G 时代的来临,万物互联的伟大构想正在成为现实。联网的物联网设备 在 2021 年已经达到了 120 亿,在未来两年,仅智能水电气表就将超过 10 亿。在如此大的物联网需求下,海量的设备接入和设备管理对网络带宽、通信协议以及平台服务架构都带来了很大挑战。如何做好以 MQTT 为代表的物联网协议性能测试,也就显得尤为重要。那么,我们该如何做好 MQTT 的性能测试呢?
什么是 MQTT 协议
MQTT 是基于 TCP/IP 协议栈构建的异步通信消息协议,是一种轻量级的发布、订阅信息传输协议。可在不可靠的网络环境中进行扩展,适用于设备硬件存储空间或网络带宽有限的场景。使用 MQTT 协议,消息发送者与接收者不受时间和空间的限制。
对于物联网协议来说,必须针对性地解决物联网设备通信的几个关键问题:其网络环境复杂而不可靠、其内存和闪存容量小、其处理器能力有限。MQTT 协议凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山。
MQTT 的发布订阅模式
发布订阅模式区别于传统的客户端-服务器模式,它使发送消息的客户端(发布者)与接收消息的客户端(订阅者)分离,发布者与订阅者不需要建立直接联系。我们既可以让多个发布者向一个订阅者发布消息,也可以让多个订阅者同时接收一个发布者的消息,它的精髓在于由一个被称为代理的中间角色(或称为 MQTT Broker)负责所有消息路由和分发的工作。传统的客户端-服务器模式可以实现类似的效果,但是无法做到像发布订阅模式这样简洁和优雅。
发布订阅模式的优点在于发布者与订阅者的解耦,这种解耦表现在以下两个方面:
- 空间解耦:订阅者与发布者不需要建立直接连接,新的订阅者想要加入网络时不需要修改发布者的行为。
- 时间解耦:订阅者和发布者不需要同时在线,即便不存在订阅者也不影响发布者发布消息。


为什么要做 MQTT 性能测试
MQTT 性能测试主要帮助我们做到如下内容:
1. 摸清 MQTT 核心指标
- 不同网络环境下,消息端到端的时延
- MQTT Broker 同时保持的最大连接数
- MQTT 收发消息的 TPS
2. 辅助 MQTT Broker 选型
物联网行业里可选的 MQTT Broker 不胜枚举,除了经典的 Mosquitto 和 AWS、Azure,百度云、阿里云、IBM 等几个提供物联网 MQTT 接入服务的产品外,可用于商业生产的 MQTT Broker 还有多款。
但是每一款 MQTT Broker 的系统性能与适用场景都不尽相同。例如,EMQ 单机性能较高,单机支持百万级并发,集群支持千万级并发,优势在于高并发连接与高吞吐消息的服务能力;HiveMQ 单机性能相对较差,有一定高并发连接与高吞吐消息的服务能力。
通过 MQTT 性能测试,我们可以更加精准的选择合适的 MQTT Broker。
业界一般如何做 MQTT 性能测试?
MQTT 性能测试的难点在于能够同时发起并保持海量的连接。
目前最常见的 MQTT 性能测试方式,是基于 JMeter 的 MQTT-Xmeter 插件实现的。该插件的底层原理就是每个线程都模拟一个 MQTT Client,向 MQTT Broker 发送连接请求。然而 JMeter 的线程模型(一个并发就是线程)决定了,想要发起海量的连接请求,施压机就必须创建同等数量的线程,不仅造成资源的严重浪费,还限制了单个施压机能够发起的总连接请求数。阿里云的性能测试 PTS 允许单个线程发起并保持最多 100 个,单台施压机最大 5 万个,单次压测最大 1 亿个 MQTT 连接数。
使用 PTS 可以帮助用户轻松发起千万乃至亿级的 MQTT 连接,节省大量时间成本和机器成本。
如何使用 PTS 发起 MQTT 亿级连接和千万消息吞吐性能测试
使用步骤
1、创建场景。我们在 PTS 控制台的【压测中心】->【创建场景】中创建 MQTT 压测场景;
2、场景配置。PTS 支持建立连接、发布消息、订阅消息和关闭连接四种测试节点。用户若仅需测试 Broker 支持的最大连接数,可以只创建建立连接节点。
对于阿里云的 MQTT 实例,用户只需要打开签名鉴权开关,填入 AccessKey ID、AccessKey Secret 和实例 ID 即可,PTS 会动态生成用户名和密码。PTS 支持指定单并发连接数,以及均匀递增、阶梯递增和固定压力三种流量模型。用户可以通过调整压测中并发数,来控制 MQTT 连接数的增长速率。
场景配置示例:1 万个 MQTT 连接作为 pub 客户端发送消息,每个 pub 客户端每秒发送 1 条 QoS0 消息;99 万个 MQTT 连接作为 sub 客户端接收消息,每个 sub 客户端每秒接收 1 条 QoS0 消息。因此,总的消息发布吞吐率为每秒 10000,总的消息接收吞吐率达到每秒 100 万。
总结
本文阐述了:
1、什么是 MQTT 协议
2、MQTT 性能测试必要性
3、使用 PTS 做 MQTT 性能测试的优势
4、如何使用 PTS 快速发起 MQTT 性能测试
本文为阿里云原创内容,未经允许不得转载。
如何发起 MQTT 亿级连接和千万消息吞吐性能测试的更多相关文章
- EMQX+阿里云飞天洛神云网络 NLB:MQTT 消息亿级并发、千万级吞吐性能达成
随着物联网技术的发展与各行业数字化进程的推进,全球物联网设备连接规模与日俱增.一个可靠高效的物联网系统需要具备高并发.大吞吐.低时延的数据处理能力,支撑海量物联网数据的接入与分析,从而进一步挖掘数据价 ...
- Netty Redis 亿级流量 高并发 实战 (长文 修正版)
目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -30[ 博客园 总入口 ] 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1 ...
- SpringCloud 亿级流量 架构演进
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...
- 【web】 亿级Web系统搭建——单机到分布式集群
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架 ...
- 从100PV到1亿级PV网站架构演变
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 一个网站就像一个人,存在一个从小到大的过程.养一个网站和养一个人一样,不同时期需要不 ...
- [转]亿级Web系统搭建:单机到分布式集群
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...
- 手机QQ公众号亿级消息实时群发架构
编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由孙子荀分享.转载请注明来自高可用架构公众号 ArchNotes. 孙子荀,2009 年在华为从事内核和分布式系统的开发工作:2011 ...
- [转载]从100PV到1亿级PV网站架构演变
原文地址:http://www.uml.org.cn/zjjs/201307172.asp 一个网站就像一个人,存在一个从小到大的过程.养一个网站和养一个人一样,不同时期需要不同的方法,不同的方法下有 ...
- TOP100summit:【分享实录-QQ空间】10亿级直播背后的技术优化
本篇文章内容来自2016年TOP100summit QQ空间客户端研发总监王辉的案例分享.编辑:Cynthia 王辉:腾讯SNG社交平台部研发总监.腾讯QQ空间移动客户端技术负责人高级工程师.09年起 ...
- 亿级Web系统搭建:单机到分布式集群【转】
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...
随机推荐
- Android Studio安装插件重启插件消失
问题 安装插件后,已经提示让重启IDE,但是重启后发现插件是安装失败了 解决方法 原因是自己改了配置,如果下载的插件是jar包,则可以安装,如果是zip压缩文件的插件,则是要我们手动解压一下 我上面的 ...
- Android CheckBox控件去除图标 样式改造
有个UI需要实现下面这种效果,但我之前是使用的CheckBox,本着能改就改的原则,还是把CheckBox改造一份,终于是实现了图中的效果 过程 1.去除CheckBox的左侧图标 CheckBox默 ...
- 后端基础PHP—正则表达
后端基础PHP-正则表达式 1.正则表达式的介绍 2.正则表达式的语法 一.正则表达式的介绍 正则表达式的介绍 · 正则表达式,又称规则表达式,通过一种特殊的语言来挑选符合条件的数据 · 在代码中简写 ...
- [vscode]使用cmake时将命令行参数传递给调试目标
一.简介 本文介绍了在vscode中使用cmake工具时,如何传递参数给编译目标的方法. 前提:使用vscode+cmake编译C/C++程序. 二.方法 在.vscode/目录下新建settings ...
- [STM32]STM32双机串口通信
[STM32]STM32双机串口通信 上一篇的通信方案在发送端高强度通信下寄了,发现是函数HAL_UART_Transmit()的锅,一个函数居然能跑0.3s左右...于是打算选用DMA收发数据,但是 ...
- python面向对象(选课系统)
一.需求分析(课程与班级合为一体) -管理员视图 -1.注册 -2.登录 -3.创建学校 -4.创建课程(先选择学校) -5.创建讲师 -学员视图 -1.注册 -2.登录功能 -3.选择校区 -4.选 ...
- dbvisivuser连oracle数据库报错没有权限
原因:数据库从11g升级为19c了 解决:ojdbc.jar也要换成最新的,导致报错的旧jar包2M大小,换成新jar包3M大小.替换jar包要将 dbvisivuser的tool driverMan ...
- verilog之readmemb
verilog之readmemb 1.基本作用 用于读取存储器的值的系统函数.这里首先要知道什么是存储器.在verilog中,有一些比较大的数据是需要存储的,一般需要使用存储器,语法结构类似二维数组. ...
- DETR:Facebook提出基于Transformer的目标检测新范式,性能媲美Faster RCNN | ECCV 2020 Oral
DETR基于标准的Transorfmer结构,性能能够媲美Faster RCNN,而论文整体思想十分简洁,希望能像Faster RCNN为后续的很多研究提供了大致的思路 来源:晓飞的算法工程笔记 ...
- KingbaseES 参数设置优先级别
Oracle的参数可以设置system和session级别,当设置了session级别的参数时,会覆盖值system级别. KingbaseES除了该两个级别外,还有database级别.user/r ...