我试图在功能测试中构建一个简单的编排引擎,如下所示:
object Engine {
def orchestrate(apiSequence : Seq[Any]) {
val execUnitList = getExecutionUnits(apiSequence) // build a specific list
schedule(execUnitList) // call multiple APIs
}
在underneath中调用的方法(getExecutionUnits和schedule)中,我应用的模式是我逐步构建一个列表(因此,不是val而是var),迭代列表并调用sepcific API的模式。并在每个上运行一些自定义验证。
我知道scala中的一个对象有点像一个单例(所以在我的例子中只有一个Engine实例)。如果我期待100次同时调用协调方法,我想知道这是否是一个合适的模式。我没有管理Engine对象中的任何其他内部变量,我只是简单地对方法中提供的参数进行操作。假设调度方法可能需要10秒钟,我担心并发访问时的行为。如果client1,client2和client3同时调用此方法,那么2个客户端是否会排队并阻止当前正在处理的客户端?
是否有更安全的惯用方法来处理用例?你是否建议使用演员来结束" orchestrate"处理并发请求的方法?
编辑:为了澄清,2个方法(getExecutionUnits和schedule)绝对必要并按顺序调用。此外,调度方法依次调用多个API(1到10之间的任何位置),重要的是它们也按顺序执行。截至目前,我有一个简单的for循环,一次解决1 Api,等待响应,然后在适当的情况下移动到下一个。
答案 0 :(得分:2)
我没有管理Engine对象中的任何其他内部变量,而我只是根据方法中提供的参数进行操作。
如果您在Engine中使用任何变量,那么这不会起作用。但是,根据您的描述,您似乎并不知道:getExecutionUnits
方法中存在局部变量,并且(可能)schedule
中的局部变量,其初始化为{{的返回值1}}。这种情况应该没问题。
如果client1,client2和client3同时调用此方法,2个客户端是否会排队并被阻止我正在处理的当前客户端?
不,如果你没有添加任何同步(如果引擎本身没有状态,你不应该)。
你是否建议使用演员来结束" orchestrate"处理并发请求的方法?
如果将其包装在一个actor中,则在引擎处理一个请求时,将阻塞等待。