加特林:生产者和消费者用户

时间:2019-07-17 08:26:50

标签: scala gatling

我有一个负载测试,其中三组用户创建某些东西,而另一组用户对其执行某些操作。

在加特林(Gatling)中协调此行为的推荐方法是什么?

我目前正在使用一个object,其中包含一个LinkedBlockingQueue,“生产者” put的ID和消费者take,请参见下文。

但是,它导致测试在〜20s(目标为1tps)后挂起。 我也尝试过将poll与超时一起使用,但是如果超时较大(1m +),则挂起轮询几乎总是会失败(30秒后)或导致挂起。

这似乎是因为所有线程都在等待队列中的所有内容而被阻塞,因此与加特林测试的运行方式不兼容(即每个用户没有1个线程)。在加特林DSL中有无阻塞的方式等待吗?

Producer.scala

// ...
scenario("Produce stuff")
    .exec(/* HTTP call which extracts an ID*/)
    .exec(session => Queue.ids.put(session("my-id").as[String])
// ...

Consumer.scala

// ...
scenario("Consume stuff")
    .exec(session => session.set("my-id", Queue.ids.take()))
    .exec(/* HTTP call which users ID*/)
// ...

Queue.scala

object Queue {
    val ids = new LinkedBlockingQueue[String]()
}

作为替代方案,我尝试使用应用程序功能,但是要确保每个用户都从应用程序中选择唯一的商品,似乎是一个难题。

1 个答案:

答案 0 :(得分:0)

确认这都是黑客,我在Consumer.scala中当前的解决方案是:

doIf(_ =>  Queue.ids.size() < MIN_COUNT)(
  pause(30) // wait for 30s if queue is initially too small
)
.doWhile(_ => Queue.ids.size() >= MIN_COUNT)(
  exec(session => session.set("my-id", Queue.ids.take()))
    .exec(...)
    .pause(30)
)