当前位置: 首页 > 科技观察

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

时间:2023-03-15 13:21:56 科技观察

Part01MQTT协议MQTT协议是IoT平台上最常用的协议之一,也是OneNET平台上主要的设备接入协议。物联网平台必须有大量的设备接入,但是MQTT接入服务可以同时支持多少台设备?了解该指标可以更好地为平台的运维提供科学依据。但是,如何快速方便地测试最大在线量指标呢?如何选择工具和制作脚本?测试性能我们首先想到的是Jmeter、Locust等常用的性能测试工具。但是这些工具的优势在于测试服务的并发性和吞吐量,不适合目前的测试场景。那么可以想到的就是使用第三方的Jar包或者第三方库实现的协议库来实现多线程启动设备。但是press的线程启动是有限的,支持几十万台设备接入的服务简直是九牛一毛,需要多少台press很难估计。又可以想到的是Select方法是对设备的Socket连接进行批量管理的。问题又出现了,Select管理的异步IO也是有限的,最终放弃了这个方法。Part02的测试方法是经过前面的分析和实践后确定的。采用异步IO方式,批量模拟设备连接到服务器,按照一定的频率上报注册消息。连接成功,设备通过定时上报心跳保持在线。实现细节如下:(1)实现设备基础类:封装一些MQTT协议消息方法,包括设备注册、订阅、发布、心跳等MQTT注册消息封装示例(Java)(2)实现设备类:主要记录设备注册状态、订阅状态、保活时间间隔、最重要的服务消息解析和响应方式,以及非阻塞Socket(JavaSocketChanel)服务消息解析代码示例(Java)(3)实现主程序类:管理设备批次,控制设备注册频率,设备上报数据时,监听服务发送数据,统计设备连接数,持续上报心跳。保持设备在线等。具体实现逻辑如下:批量初始化设备列表;同时启动三个线程;启动设备注册线程,初始化设备和服务之间的连接并上传注册消息。根据设置,指定同一时间可以同时注册的设备数量,注册所有设备。之后会自动退出;启动连接统计线程,周期性统计连接成功设备数、订阅成功数、连接失败设备数;启动设备Socket遍历线程,不断轮询每个Socket接收到的数据,并查看接收到的数据处理和响应,每轮遍历结束后,需要给长时间没有上报心跳的设备上传心跳消息,从而达到保活设备的目的。程序主题类收到线程逻辑代码片段(Java)并完成程序代码后,测试工具就完成了。该工具已经在项目性能测试中实际使用。它可以使用压力机所有可用的端口来测试最大在线设备数量。居然在几分钟内完成了50000+台设备在Linux虚拟机中的注册,并保持设备长时间在线。该工具可以最大限度地利用压力端口资源,提高测试执行效率。对于在线量大的服务,只需要在更多的印刷机上运行这个工具。