You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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开始递增。

原方法失效原因说明

  1. $randomString()默认生成的字符串长度较短(默认10字符),在1000次并发请求下,重复碰撞的概率较高;
  2. 直接在请求头中引用CSV字段无效,Artillery不会自动将CSV数据绑定到请求头,需要通过beforeRequest钩子函数手动读取赋值。

内容的提问来源于stack exchange,提问作者serchvocky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:32:42