Akka平衡池使用固定调度程序(PinnedDispatcher)

3

我有几个数据库IO操作希望能同时运行。在我的情况下,最好使用BalancingPool路由器。

文档中提到,如果工作进程中涉及阻塞操作,则应该使用线程池执行器而不是默认的fork-join-dispatcher。

我不想在Akka配置文件中进行配置,因此我认为这应该是在代码中完成的方式:

  val router = context.actorOf(BalancingPool(5).withDispatcher("my-pinned-dispatcher").props(Props[History]), "HistoryBalancingRouter")

但是文档中对于PinnedDispatcher的说明如下:

这个派发器为每个使用它的Actor分配了一个独特的线程; 也就是说每个Actor都将拥有自己的线程池,该池中只有一个线程。

邮箱:任何,每个Actor都创建一个

而对于BalancingPool,它指出工作线程共享单个邮箱:

BalancingPool自动为其路由器使用特殊的BalancingDispatcher - 忽略在路由器Props对象上设置的任何调度程序。这是必要的,以通过所有路由器共享同一邮箱来实现平衡语义。

虽然无法更改路由器使用的调度程序,但可以对使用的执行程序进行微调。 默认情况下会使用fork-join-dispatcher,并可按Dispatchers中所述进行配置。在预期路由器执行阻塞操作的情况下,将其替换为线程池执行者并显式指定分配的线程数可能很有用

那么这里到底发生了什么,与邮箱和线程有什么关系?

我使用线程池执行程序实现BalancingPool的示例是否合理?

1个回答

1
BalancingPool总是与BalancingDispatcher一起使用,它会简单地拒绝您的PinnedDispatcher设置。原因是BalancingDispatcher允许演员共享一个公共邮箱(以提高性能),而其他调度程序不支持。
请注意,几个调度程序允许您配置它们内部将使用的Executor。对于BalancingPool,默认情况下为fork-join-executor(文档错误地说成了“fork-join-dispatcher”),但您可以将其更改为使用thread-pool-executor。这里有一个调度程序配置示例:http://doc.akka.io/docs/akka/2.3.13/scala/dispatchers.html#Setting_the_dispatcher_for_an_Actor,您只需要更改执行器类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接