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
相关产品推荐
相关产品推荐

