最近在学习locust,请教一下大家,分布式压测的时候怎么解决参数化的问题。
使用分布式运行locust时,分布节点运行的脚本都是同一份,这也导致每个脚本读取的参数文件都是一样的,例如负载的时候会出现登陆同一个账号的情况,locust本身有针对这个做处理吗。我能想到的是slave节点分别运行不同的脚本读取不同配置文件来避免,或者通过其他接口获取不重复的数据,但这都很麻烦。我对locust还不熟,网上也没这方面的资料,大家是怎么解决这个问题的呢,谢谢!
脚本类似于这种结构
from locust import task, TaskSet, HttpUser, between
import queue
class TestCase(TaskSet):
def on_start(self):
print("--初始化--")
user_phone = self.user.user_list.get() # 从队列里取
@task
def case_1(self):
pass
class TestRuner(HttpUser):
tasks = [TestCase]
wait_time = between(1,3)
user_list = queue.Queue()
# 类似于从本地文件读取账号参数
for phone in range(10001,10200):
user_list.put_nowait(phone)
这个问题本意是想找找locust本身有没有对这种问题做处理,这几天网上找了不少资料,确定locsut是没有做处理的。
locust的worker节点是跨进程的,对于这个问题我自己的处理方式有2种,遇到相同问题的同学可以参考一下。
1、在脚本逻辑不复杂、节点不多的情况下,修改每个worker脚本读取不同范围的参数即可。也就是把参数划分出几个区域,每个脚本读取各自的范围。
例如:worker1-->(0,2000),worker2-->(2000,4000)
假如你要运行10个节点,也只是每个脚本改一行代码而已,用不了几分钟。
2、如果业务逻辑复杂,需要并发运行大量的节点,改脚本就有点麻烦了,这时候可以搭一个redis,节点脚本从redis队列里面取即可
另外如果你有办法跨进程共享数据,也可以自己实现,欢迎你共享出来,我目前技术水平达不到,暂时只能用上面的方法。