10

我有一个基于参与者的系统,它执行周期性的、cpu 密集型数据摄取以及为 RESTful 端点提供服务。我正在使用 Akka 演员来发信号/控制摄取过程的各个阶段,并使用 Spray(当然是基于 Akka 构建的)来服务于我的宁静端点。

我的问题是:当摄取开始时,它会消耗大部分 CPU,使 RESTful 端点饿死直到它完成。

降低摄取优先级的最佳方法是什么?目前,摄取和喷射模块共享相同的 ActorSystem,但如果这有助于解决问题,它们可以分开。

4

2 回答 2

10

您系统中的不同参与者似乎需要生活在不同的调度程序中。为 CPU 密集型 Actor 创建一个新的调度器,并将 Web 服务 Actor 保留在默认调度器中(或者如果您认为合适,也可以将它们移动到另一个调度器)

您可能想要调整新创建的调度程序 - 例如,如果您说您的摄取演员执行计算密集型作业,您应该将调度程序的并行度降低到接近 1.0

将您的参与者系统分成不同的调度程序可以防止与您所拥有的类似的问题 - 如果某些参与者开始占用底层线程,它们最终会使运行它们的调度程序饱和。通过将 Web Actor 放在另一个调度程序中,您可以限制 CPU 密集型 Actor 对系统其余部分的影响。这有点类似于“bulkheading”的概念。

以下是有关 Akka 调度程序的更多信息:http: //doc.akka.io/docs/akka/2.2.0/scala/dispatchers.html

要配置新的调度程序,还值得看看文档的配置部分:http: //doc.akka.io/docs/akka/2.2.0/general/configuration.html

于 2013-08-26T19:25:25.550 回答
3

可以构建优先级邮箱来定义以哪个优先级处理哪些消息。如果您想存储消息并在遇到特定状态时处理它们,您还可以存储/取消存储消息,这与热交换很好地配合使用。关于存储的信息在这里:http ://doc.akka.io/docs/akka/snapshot/scala/actors.html

于 2014-01-28T22:08:25.890 回答