我有一个负载测试,其中三组用户创建某些东西,而另一组用户对其执行某些操作。
在加特林(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]()
}
作为替代方案,我尝试使用应用程序功能,但是要确保每个用户都从应用程序中选择唯一的商品,似乎是一个难题。
答案 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)
)