MQTT协议是测试物联网平台的最通用协议之一,也是大设OneNET平台的首要设备接入协议。物联网平台必须海量设备接入,备连但MQTT接入服务究竟能同时支持多少设备同时在线呢?了解这个指标能更好地为平台的接数运维和运营提供科学的依据。
可是测试,如何快速简便地测试最大在线量指标呢?如何选取工具和制作脚本呢?
测试性能我们首先想到的大设是常用的Jmeter和Locust等性能测试工具。但是备连这些工具的优势在测试服务的并发和吞吐量,并不适合当前的测试场景。
然后能想到的是利用第三方Jar包或者三方库实现的协议库,采用多线程启动设备。但是压力机线程启动有限,对动则支持几十万上百万设备接入量的服务简直就是杯水车薪,需要多少压力机难以估量。
再次能想到的是Select方法批量管理设备的Socket连接。问题又出现了,Select管理的异步IO也是有极限的,此方法最终还是放弃。
经过前面的分析、实践最终方法确定,采用异步IO的方式批量模拟设备连接服务器,按照一定的频率上报注册报文,不断遍历设备Socket接收的缓存数据,解析服务消息来判断设备是否连接成功,并通过周期性上报心跳来保持设备持续在线。实现细节如下:
(1)实现基础设备类:封装部分MQTT协议报文方法,其中包括设备注册、订阅、发布、心跳等。
MQTT注册报文封装示例(Java)
(2)实现设备类:主要记录设备注册状态、订阅状态、保活间隔,最重要的服务消息的解析和响应方法,以及设备连接服务器的非阻塞Socket(Java中的SocketChanel)
服务消息解析代码示例(Java)
(3)实现程序主体类:管理批量设备,控制设备注册频率,设备何时上报数据、监听服务下发数据,统计设备连接数,持续上报心跳,保持设备在线等。具体实现逻辑如下:
程序主题类接收线程逻辑代码片段(Java)
完成程序代码后,测试工具制作完成。
此工具已实际用于项目性能测试中,可将压力机全部可用端口用于最大设备在线量的测试中,实际在Linux虚拟机中几分钟内完成50000+设备注册,并保持设备长时间持续在线。
此工具能最大限度利用压力机端口资源,提升测试执行效率,对于在线量较大的服务,只需要在更多的压力机上运行此工具即可。
责任编辑:庞桂玉 来源: 移动Labs MQTT物联网(责任编辑:探索)
鑫科材料(600255.SH):向激励对象授予股票期权4969万份 行权价格为2.38元/份
《哆啦A梦牧场物语2》最新系统介绍PV公布 游戏11月2日发售