Gatling:并行地从Collection (Feeder)中消费所有值



我有一个用户id列表,它们可以存储在Collection或Feeder中。在测试中,我在一个POST请求中使用提供的id创建用户(大约2000个用户),然后发送GET请求来验证用户是否已创建。创建所有用户可能需要5-10秒,但第一个用户会在0.5-1秒后出现。我在两个不同的场景中同时创建和验证用户。问题是,verifyUsers(id)将逐个为每个id发送GET请求,但我需要并行发送它们,因为每个GET请求将花费一些时间,我不想创建一个队列。

def createUsers(ids: List[String]): ScenarioBuilder = scenario("Create users")
.exec(createUsersForIds(ids))
def verifyUsers(ids: List[String]) = scenario("Verify users")
.repeat(ids.size, "iterator") {
exec(session => {
val index: Int = session("iterator").as[Int]
session.set("id", ids.take(index))
})
.exec(verifyUserWithId) // verifyUserWithId will then take a userId from the session and send a GET request with that id
}
setUp(
createUsers(ids).inject(atOnceUsers(1)),
verifyUsers(ids).inject(atOnceUsers(1))
)

简而言之,您需要多个生产者(createUsers场景中的虚拟用户)和多个消费者(verifyUsers场景中的虚拟用户),两者之间有一个队列。

一些提示:

  • 使用并发队列,如java.util.concurrent.ConcurrentLinkedQueue
  • 使用一些计数器,如AtomicLong来跟踪产生和消耗的记录数量,以便您可以检测何时消耗了最终产生的所有记录。
  • 实现消费者端,以便当没有可用的记录时(可能是因为您消耗的速度比生产的速度快),您执行循环(asLongAs)并暂停。

编辑:如果您的用例实际上是生产者一次生成所有记录,那么解决方案要简单得多:

  • 使生产者和消费者场景顺序,参见https://gatling.io/docs/gatling/reference/current/core/injection/#sequential-scenarios
  • 让所有消费者在循环中轮询并发队列(AslongAs或doWhile取决于您如何实现逻辑),只要轮询记录不为空

希望有帮助!

最新更新