1

我正在尝试在功能测试中构建一个简单的编排引擎,如下所示:

object Engine {
  def orchestrate(apiSequence : Seq[Any]) {
    val execUnitList = getExecutionUnits(apiSequence) // build a specific list
    schedule(execUnitList) // call multiple APIs
  }

在下面调用的方法(getExecutionUnits 和 schedule)中,我应用的模式是我逐步构建一个列表(因此,不是 val 而是一个 var),迭代列表并调用特定 API 并运行一些自定义验证在每一个上。

我知道 scala 中的对象有点等同于单例(所以在我的例子中只有一个 Engine 实例)。如果我期望同时调用 100 次 Orchestrate 方法,我想知道这是否是一个合适的模式。我不管理 Engine 对象中的任何其他内部变量,我只是对方法中提供的参数进行操作。假设 schedule 方法最多需要 10 秒,我担心并发访问时的行为。如果client1、client2和client3同时调用这个方法,会不会有2个客户端排队被我当前正在处理的客户端阻塞?

是否有更安全的惯用方式来处理用例?您是否建议使用演员来包装“编排”方法来处理并发请求?

编辑:为了澄清,这两种方法(getExecutionUnits 和 schedule)是绝对必要的,并按顺序调用。此外,schedule 方法依次调用多个 API(1 到 10 之间的任意位置),并且它们也按顺序执行很重要。截至目前,我有一个简单的 for 循环,一次处理 1 个 Api,等待响应,然后在适当的情况下移动到下一个。

4

1 回答 1

2

我不管理 Engine 对象中的任何其他内部变量,我只是对方法中提供的参数进行操作。

如果您根本在 Engine 中使用任何 var,这将不起作用。但是,根据您的描述,您似乎没有:您在getExecutionUnits方法中有一个本地 var,并且(可能)有一个本地 var,schedule其中使用getExecutionUnits. 这个案子应该没问题。

如果client1、client2和client3同时调用这个方法,会不会有2个客户端排队被我当前正在处理的客户端阻塞?

不,如果你不添加任何同步(如果引擎本身没有状态,你不应该)。

您是否建议使用演员来包装“编排”方法来处理并发请求?

如果您将它包装在一个参与者中,那么客户端在引擎处理一个请求时被阻塞等待。

于 2014-08-11T05:43:04.373 回答