提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本篇文章主要介绍如何使用locust对MQTT协议进行压测,最近公司一个项目用了MQTT5.0,最近要进行压测,最开始是想着用jmeter,因为看官方博客里面也有写如何在 JMeter 中使用 MQTT 插件,然后发现jmeter竟然不支持5.0,因为设置消息属性只有5.0才可以,没办法,那就看看平常压测用的locust支不支持,paho.mqtt可以支持5.0,最后就选用了python+locust+paho.mqtt来进行压测
一、安装locust+paho.mqtt库
安装 Locust:
pip install locust
安装 Paho-MQTT:
pip install paho-mqtt
本次测试用的各版本号为:
python:Python 3.8.0
locust:locust 2.15.1
paho-mqtt:paho-mqtt 1.6.1
二、代码编写
本次测试是模拟3000个站点进行消息上报
1.引入库
import json
import queue
import time
import paho.mqtt.client as mqtt
from paho.mqtt.packettypes import PacketTypes
2.读入数据
从文件中读取站点号,并放入队列中待用
# 创建队列
user_id_queue = queue.Queue()
# 读取站点号文件
filename = f"{rootPath}/docs/station.txt"
station_id_list = get_station(filename, 0, 3000) # 取前3000个站点号
# print(station_id_list)
for station_id in station_id_list:
# 把站点号信息存到队列中去
user_id_queue.put_nowait(station_id)
3.编写消息发送
class PublishTask(TaskSet):
def on_start(self):
self.station_id = self.user.user_id_queue.get()
self.tsn = 10001
client_id = str(self.station_id)
self.mqtt_client = mqtt.Client(client_id=client_id, protocol=mqtt.MQTTv5)
self.mqtt_client.username_pw_set(username="用户名", password="密码")
self.mqtt_client.connect("MQTT服务器IP", port=1883, keepalive=心跳间隔)
def bet(self):
# 记录发送的开始时间
start_time = time.time()
self.mqtt_client.loop_start()
timestamp = int(time.time() * 1000) # 获取13位时间戳
# 设置消息属性
publish_properties = mqtt.Properties(PacketTypes.PUBLISH)
publish_properties.UserProperty = ("TIMESTAMP", str(timestamp))
# 获取 topic, payload
topic, payload = report_wager(self.station_id, self.tsn)
# 发布消息,并附带属性
result, mid = self.mqtt_client.publish(topic, payload=json.dumps(payload), qos=0, properties=publish_properties)
self.mqtt_client.loop_stop()
# 记录结束时间
end_time = time.time()
fire_dicts = fire_dict("投注", json.dumps(payload), start_time, end_time)
if result == mqtt.MQTT_ERR_SUCCESS:
events.request.fire(**fire_dicts)
self.tsn += 1
else:
fire_dicts.update({
"exception": "%s" % [result, mid]
})
events.request.fire(**fire_dicts)
raise ValueError("上报失败!")
tasks = {
bet: 1
}
总结
最开始在网上找MQTT设置消息属性的方法,都是PROP_USER_PROPERTY,但实际根本用不了,折腾了一会才解决这个问题,再然后就是3000个站点发送消息,之前都是一个client_id,发送的数据缺失了不少,最后才发现是client_id的问题,同个client_id,就需要连接-发送消息-断开连接-连接-发送消息-断开连接,不是并行的,因为client_id会冲突,后面换成不同的后,RPS立马就起来了。