繁体   English   中英

Gatling:生产者和消费者用户

[英]Gatling: Producer and consumer users

我有一个负载测试,其中三组用户创建一些东西,一组不同的用户对他们执行一些操作。

在 Gatling 中协调这种行为的推荐方法是什么?

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

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

这似乎是因为所有线程都被阻塞,等待队列中的某些内容,因此与 Gatling 测试的运行方式不兼容(即每个用户不是 1 个线程)。 在 Gatling DSL 中是否有非阻塞的等待方式?

生产者.scala

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

消费者.scala

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

队列.scala

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

作为替代方案,我尝试使用应用程序功能,但确保每个用户从应用程序中选择一个独特的项目似乎是一个更难的问题。

承认这完全是一种黑客行为,我目前在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)
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM