我有一个 REST 服务,它只服务一个 POST 请求。我想使用演员来处理请求。但是我不知道我是否应该创建一个参与者并使用该参与者派生所有请求,或者我是否应该在每次收到请求时创建一个参与者。这些选择的优缺点是什么。此外,当我创建一个参与者并使用该参与者处理我的所有请求时,它是如何并行执行的。它当然看起来像顺序执行。我也想明白这一点。
3 回答
如果使用一个 Actor 请求会在 Actor 邮箱内排队,并由 Actor 逐一处理。这是顺序的,不推荐。
这就是为什么说
一个演员不是演员。
创建一个管理其他 Actor 的管理器 Actor。由于演员非常便宜,您可以为每个请求创建一个演员而不会出现任何问题。使用未来和未来的直接结果进行数据库交互和其他繁重的计算,以使用pipeTo
模式请求处理参与者。
仅使用 Actor 来划分和分配工作,并使用 Futures 来完成计算密集型工作。
我同意@pamu 所说的。演员很便宜。但请注意,如果您要使用单例 Actor,请不要使其成为有状态的,否则会造成麻烦。
如果你打算使用 Futures 做密集的工作(你应该这样做)。确保给他们特定的 ExecutionContext / Dispatcher。使用全局调度程序或 ExecutionContext 不好。
或者在你拥有的每个 api 中,创建一个特定的调度程序来控制将在那种端点/api 上工作的 Actors 的数量。
例如你有“/get/transactions”
指定一个只会产生这个 # of 线程的调度程序。对于这个 api。
这样做的好处是您可以控制应用程序使用的线程数和资源数。在处理繁忙的交通时。这是一个很好的做法。
我会根据请求创建一个演员,并使用“告诉”模式将工作委托给新创建的演员。如果您使用的 REST 框架支持完成来自另一个参与者的请求(Spray,Akka-HTTP 支持),那么您可以完成来自这个新参与者的请求。这样,您的请求处理参与者可以自由地处理下一个请求。
我发现这是一个很好的资源,它解释了 ask & tell 和 per-request-actors 的优缺点。它可以对您有所帮助。