如何进行MQTT协议的压测
背景信息
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,如:机器与机器(M2M),通信和物联网(IoT)。
本文所述流程通过建立两个线程组,分别代表发布者和订阅者,并模拟了他们基于MQTT协议进行发布和订阅消息的通信方式。
如果您需要对MQTT协议的场景进行压测,您可以使用JMeter的MQTT的相关Sampler来编写脚本,然后将脚本文件上传至CPTS发起压测。本文将介绍详细步骤。
前期部署
在使用JMeter之前,您需要做好如下准备工作。
- 部署可在公网访问的MQTT服务。
- 安装JMeter 4.0版。
- 安装MQTT插件
- 下载mqtt-jmeter所需版本JAR包:mqtt-xmeter-1.0.1-jar-with-dependencies.jar。
- 拷贝插件JAR包到JMeter安装目录的lib/ext/子目录下。
JMeter脚本编写步骤
- 启动JMeter GUI。
- 为JMeter Test Plan添加2个线程组。
- 右键单击Test Plan,选择Add > Threads (Users) > Thread Group。
- 根据需要修改线程组的参数,将两个线程组命名为不同的名字以便区分。本例中分别命名为Thread Group1和Thread Group2。
部分参数配置说明:
Name: 线程组名字,建议在多线程组并存时取有意义的名字以区分和查找。
Number of Threads (users): 线程数,既模拟用户的数量。
Ramp-Up Period (in seconds): 线程启动后运行的时长,单位为秒。例:有100个线程,Ramp-Up Period设置为2,既每秒启动50个线程,2秒内启动完成。默认值为0,即所有线程开始后立即启动。
Loop Count:循环次数。若勾选forever,则除非手动停止或崩溃,将一直运行。
- 为两个线程组分别添加一个Once Only Controller。右键单击Thread Group,选择Add > Logic Controller > Once Only Controller。
- 为两个Once Only Controller分别添加一个MQTT connect并配置相关参数。
- 添加MQTT Connect。右键单击Once Only Controller,选择Add > Sampler > MQTT Connect。
- 根据实际情况配置参数。
部分参数说明:
Name:MQTT Connect名字。
Comments:注释。
Server name or IP:服务器名或IP地址。
Port number:端口号。
MQTT version:MQTT版本。
Timeout(s):操作超时时间,单位秒。
Protocols:连接协议,有TCP和SSL两种协议。
Keep alive(s):活动心跳间隔时间,单位秒。会根据设置的时间间隔发送活动心跳。
- 为线程组1添加一个MQTT Pub Sampler并设置一个Constant Timer。
- 添加一个MQTT Pub Sampler。右键单击Thread Group1,选择Add > Sampler > MQTT Pub Sampler。
- 按照需求配置Pub Sampler的参数。
部分参数配置说明:
Name:Sampler名字。
Comments:注释。
QoS Level:客户端向服务器发布消息的服务质量等级。若设为0,则即只发送一次。
Topic name:消息主题。
Add timestamp in payload:是否在消息头添加发送时间戳。建议选中此项,便于检查消息时延。
Payloads:消息体。
- 为MQTT Pub Sampler配置一个Constant Timer。右键单击MQTT Pub Sampler,选择Add > Timer > Constant Timer。
部分参数配置说明:
Name:Constant Timer名字。
Comments:注释。
Thread Delay (in milliseconds):延时时间,单位毫秒。即每次发布消息后等待的时间。
- 为线程组2配置一个MQTT Sub Sampler,并按照需求配置参数。
- 添加一个MQTT Sub Sampler。右键单击Thread Group2,选择Add > Sampler > MQTT Sub Sampler。
- 为MQTT Sub Sampler配置参数。
部分参数配置说明:
Name:Sampler名字。
Comments:注释。
QoS Level:客户端向服务器发布消息的服务质量等级。若设为0,则即只发送一次。
Topic name(s):消息主题。应与发布消息的主体一致,例如本例中均为cpts_test。
Payload includes timestamp:是否在收到消息后从消息头解析发送时间戳。建议选中此项,便于检查消息时延。
Sample on:表示取样的方式,有两种形式。
- specified elapsed time (ms):默认选项,默认值为1000,单位毫秒。表示持续接收消息的时间区间。
- number of received message:默认值为1。表示每收到设定值数量的消息,sampler会取样一次。
Debug response:可打印接收到的消息内容,方便调试排查问题。
- 在Test Plan中添加View Results Tree, 观测结果。右键单击Test Plan,选择Add > Listener > View Results Tree。
- 脚本编辑完成后,单击页面顶部的绿色开始按钮,运行脚本。通过View Results Tree监听器查看脚本是否运行正常。在左侧导航树中,选择View Results Tree,检查所有Sampler是否都配置正确并符合预期。在该监听器中,如果Sampler前面有绿色对勾表示运行正常,如下图所示。如出现运行异常的Sampler,请根据前述步骤重新进行调试。
- 若调试成功,点击Save Test Plan as,并选择合适路径,即可保存为JMX文件。
CPTS操作步骤
将JMX脚本,CSV文件(如有)上传到CPTS-JMeter发压场景,设置压测量级,即可随时发起压测。
具体操作,请参考创建JMeter发压场景。