【python+locust+MQTT】用Locust实现MQTT压测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本篇文章主要介绍如何使用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立马就起来了。

  • 15
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用PythonLocust来进行对ES7的压测。首先,确保你已经安装了PythonLocust。 接下来,你需要安装elasticsearch-py库,它是Python与Elasticsearch进行交互的库。可以使用以下命令安装: ``` pip install elasticsearch ``` 然后,创建一个Python脚本,导入必要的模块和库: ```python from locust import HttpUser, task, between from elasticsearch import Elasticsearch class ESUser(HttpUser): wait_time = between(1, 5) def on_start(self): # 创建一个Elasticsearch客户端连接 self.client = Elasticsearch(['localhost:9200']) @task def search(self): # 定义一个搜索任务 query = { "query": { "match_all": {} } } # 发送搜索请求 response = self.client.search(index='your_index', body=query) # 打印搜索结果 print(response) ``` 在上面的代码中,我们创建了一个名为ESUser的Locust用户类。在`on_start`方法中,我们创建了一个Elasticsearch客户端连接。 然后,在`@task`装饰的`search`方法中,我们定义了一个搜索任务。你可以根据自己的需求修改查询条件。在该方法中,我们发送了一个搜索请求,并打印了搜索结果。 最后,你可以在命令行中使用Locust命令来启动压测: ``` locust -f your_script.py --host=http://localhost:9200 ``` 替换`your_script.py`为你的脚本文件名,`http://localhost:9200`为你的ES7的地址。 然后,你可以在浏览器中访问Locust的Web界面(默认为http://localhost:8089)来配置并启动压测。 注意:在进行压测之前,请确保你已经在ES7中创建了索引,并且数据已经准备好。另外,压测会对目标系统造成一定的负载,请谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值