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

Gatling:如何并行消费Feeder/集合中所有值以验证用户

解决方案

方法1:利用Feeder+多虚拟用户实现并行验证

这是Gatling中实现并发验证最常用的方式,将ID列表转为Feeder,通过启动多个虚拟用户同时从Feeder中获取ID并发送请求,天然实现并行。

修改后的代码:

// 将ID列表转换为Feeder
val userIdsFeeder: Feeder[String] = ids.map(id => Map("id" -> id)).circular

def createUsers(ids: List[String]): ScenarioBuilder = scenario("Create users")
    .exec(createUsersForIds(ids))

def verifyUsers() = scenario("Verify users")
    .feed(userIdsFeeder) // 从Feeder中获取单个用户ID
    .exec(verifyUserWithId)

setUp(
    createUsers(ids).inject(atOnceUsers(1)),
    // 根据系统承受能力调整并发用户数,这里示例10秒内启动200个用户持续验证
    verifyUsers().inject(rampUsers(200) during (10 seconds))
)

这种方式的优势是可以灵活控制并发量,避免一次性发送大量请求压垮服务,同时完全符合Gatling的性能测试模型。

方法2:用parallel块分批次并行请求

如果需要在单个虚拟用户内实现批量并行请求,可以使用Gatling的parallel块,建议分批次处理以避免客户端资源耗尽:

def verifyUsers(ids: List[String]) = scenario("Verify users")
    // 将2000个ID按每50个一组拆分,可根据实际情况调整批次大小
    .foreach(ids.grouped(50).toList, "idBatch") {
        exec(session => session.set("idBatch", session("idBatch").as[List[String]]))
        // 批次内的请求并行发送
        .parallel(
            foreach("${idBatch}", "id") {
                exec(verifyUserWithId)
            }
        )
    }

setUp(
    createUsers(ids).inject(atOnceUsers(1)),
    verifyUsers(ids).inject(atOnceUsers(1))
)

该方法在单个用户内实现批次并行,适合需要严格控制请求批次的场景。

方法3:自定义异步请求(底层实现)

如果需要更灵活的异步控制,可以结合Scala的Future实现全量并行请求,但注意一次性发送2000个请求可能触发服务端限流或客户端资源耗尽:

import scala.concurrent.Await
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

def verifyUsers(ids: List[String]) = scenario("Verify users")
    .exec(session => {
        // 并行发送所有验证请求
        val requestFutures = ids.map(id => {
            val req = verifyUserWithId.build(session.set("id", id)).send()
            req.future
        })
        // 等待所有请求完成,超时时间可调整
        Await.result(Future.sequence(requestFutures), 30 seconds)
        session
    })

setUp(
    createUsers(ids).inject(atOnceUsers(1)),
    verifyUsers(ids).inject(atOnceUsers(1))
)

额外优化建议

由于用户是分批创建的,可以在验证场景中加入短暂延迟,避免初期大量验证请求失败:

def verifyUsers() = scenario("Verify users")
    .pause(1 second) // 等待首批用户创建完成
    .feed(userIdsFeeder)
    .exec(verifyUserWithId)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:05:18