性能测试之MQTT最大设备连接数

移动开发
MQTT协议是一种消息队列传输协议,采用订阅、发布机制,订阅者只接受自己已经订阅的数据,非订阅数据则不接受,既保证了必要的数据交换,又避免了无效数据造成的存储与处理。因此在工业物联网中得到广泛的应用。

Part 01

MQTT协议

MQTT协议是物联网平台的最通用协议之一,也是OneNET平台的首要设备接入协议。物联网平台必须海量设备接入,但MQTT接入服务究竟能同时支持多少设备同时在线呢?了解这个指标能更好地为平台的运维和运营提供科学的依据。

可是,如何快速简便地测试最大在线量指标呢?如何选取工具和制作脚本呢?

测试性能我们首先想到的是常用的Jmeter和Locust等性能测试工具。但是这些工具的优势在测试服务的并发和吞吐量,并不适合当前的测试场景。

然后能想到的是利用第三方Jar包或者三方库实现的协议库,采用多线程启动设备。但是压力机线程启动有限,对动则支持几十万上百万设备接入量的服务简直就是杯水车薪,需要多少压力机难以估量。

再次能想到的是Select方法批量管理设备的Socket连接。问题又出现了,Select管理的异步IO也是有极限的,此方法最终还是放弃。

Part 02

测试方法 

经过前面的分析、实践最终方法确定,采用异步IO的方式批量模拟设备连接服务器,按照一定的频率上报注册报文,不断遍历设备Socket接收的缓存数据,解析服务消息来判断设备是否连接成功,并通过周期性上报心跳来保持设备持续在线。实现细节如下:

(1)实现基础设备类:封装部分MQTT协议报文方法,其中包括设备注册、订阅、发布、心跳等。

图片

MQTT注册报文封装示例(Java)

(2)实现设备类:主要记录设备注册状态、订阅状态、保活间隔,最重要的服务消息的解析和响应方法,以及设备连接服务器的非阻塞Socket(Java中的SocketChanel)

图片

服务消息解析代码示例(Java)

(3)实现程序主体类:管理批量设备,控制设备注册频率,设备何时上报数据、监听服务下发数据,统计设备连接数,持续上报心跳,保持设备在线等。具体实现逻辑如下:

  • 批量初始化设备列表;
  • 同时启动一下三个线程;
  • 启动设备注册线程,初始化设备与服务连接并上行注册报文,可根据设置,指定当前可同时注册的设备数,所有设备注册完成后自动退出;
  • 启动连接统计线程,周期性统计设备连接成功个数、订阅成功个数、连接失败设备等数据;
  • 启动设备Socket遍历线程,持续轮询每个Socket的接收数据,对接收到的数据处理和响应,每轮遍历完毕对需要对未长时间未上报心跳的设备上行心跳报文,以达到设备保活的目的。

图片

程序主题类接收线程逻辑代码片段(Java)

完成程序代码后,测试工具制作完成。

此工具已实际用于项目性能测试中,可将压力机全部可用端口用于最大设备在线量的测试中,实际在Linux虚拟机中几分钟内完成50000+设备注册,并保持设备长时间持续在线。

此工具能最大限度利用压力机端口资源,提升测试执行效率,对于在线量较大的服务,只需要在更多的压力机上运行此工具即可。

责任编辑:庞桂玉 来源: 移动Labs
相关推荐

2012-05-04 08:03:21

Windows

2011-07-22 16:26:50

SDE最大连接数

2011-04-07 14:17:56

2010-04-20 16:38:44

Oracle最大连接数

2012-03-28 14:46:57

Windows服务器终端连接数

2010-05-17 11:38:15

2021-07-02 10:42:55

MySQL连接数管理

2010-10-11 13:29:53

MYSQL最大连接数

2010-10-14 15:00:25

MySQL服务器

2010-05-10 16:40:18

终端服务器超出了最大允

2014-04-03 14:05:04

CactiCacti监控

2010-05-19 16:10:49

MySQL连接数

2010-11-08 14:40:46

SQL Server连

2011-05-12 14:50:03

2010-05-24 11:00:18

2010-06-13 17:29:10

MySQL连接数

2010-05-31 19:26:02

Ubuntu mrtg

2019-10-08 13:21:15

MySQL连接数数据库

2010-04-23 16:26:30

Oracle并发连接数

2010-05-31 19:42:00

Ubuntu
点赞
收藏

51CTO技术栈公众号