阿卡演员优先事项

时间:2013-08-26 18:33:02

标签: multithreading scala akka spray

我有一个基于actor的系统,它执行周期性的,CPU密集型数据摄取以及RESTful端点。我正在使用Akka演员来发信号/控制摄取过程的各个阶段,而Spray(当然是建立在Akka上)来为我的休息终点提供服务。

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

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

2 个答案:

答案 0 :(得分:9)

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

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

将您的actor系统分成不同的调度程序可以防止类似于您拥有的问题 - 如果某些actor开始占用底层线程,它们最终会使运行它们的调度程序饱和。通过将Web角色放在另一个调度程序中,可以限制CPU密集型角色对系统其余部分的影响。这有点类似于"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

答案 1 :(得分:3)

可以构建优先级邮箱来定义处理哪些消息的优先级。 如果要隐藏消息并在遇到某个状态时处理它们,您还可以存储/解除与hotswap很好地工作的消息。关于藏匿的信息在这里:http://doc.akka.io/docs/akka/snapshot/scala/actors.html