如何用Artillery为每个请求发送不同的request-id请求头?
问题
我在进行性能测试时,尝试发送1000个并发请求,每个请求需携带不同的request-id请求头。目标API会检测重复的request-id并发出提示,但目前Artillery生成的大部分请求使用了相同的request-id。请问需要添加哪些配置参数来避免该问题?
当前使用的Artillery配置如下:
config: plugins: expect: {} phases: - duration: 1 # Phase duration in seconds arrivalRate: 1000 # Initial number of virtual requests per second name: Warn up ensure: maxErrorRate: 0 defaults: headers: Content-Type: application/json request-id: "request-{{ $randomString() }}"
我尝试过以下方法但均未解决:
- 通过.csv文件作为负载来设置请求头,但请求头无法读取该文件中的值;
- 拼接随机字符串与数字,但仍出现相同的问题。
解决方法
方案1:使用UUID生成唯一request-id
Artillery内置的$uuid()函数能生成通用唯一识别码,重复概率可以忽略不计,完全适配1000并发请求的唯一性需求。直接修改配置中的request-id字段即可:
defaults: headers: Content-Type: application/json request-id: "request-{{ $uuid() }}"
方案2:结合虚拟用户ID与请求序号
如果偏好可控的唯一标识规则,可通过虚拟用户ID+请求序号的组合生成,这种方式能100%保证唯一性:
defaults: headers: Content-Type: application/json request-id: "request-{{ $userId() }}-{{ $requestNumber() }}"
$userId():返回当前虚拟用户的唯一ID;$requestNumber():返回当前虚拟用户发送的请求序号,每个用户的序号从1开始递增。
原方法失效原因说明
$randomString()默认生成的字符串长度较短(默认10字符),在1000次并发请求下,重复碰撞的概率较高;- 直接在请求头中引用CSV字段无效,Artillery不会自动将CSV数据绑定到请求头,需要通过
beforeRequest钩子函数手动读取赋值。
内容的提问来源于stack exchange,提问作者serchvocky
相关产品推荐
相关产品推荐

