2

这是我的用例:

我想创建一个大小为 x 的平衡池路由器(x 是在运行时确定的实例/路由的数量),每个路由都有自己的专用线程。每个路由都应该执行阻塞操作。

Akka 文档解释说您不能更改平衡池的调度程序。这消除了使用固定调度程序的选项(这正是我需要的,每个路由大小为 1 的线程池)。

来自Akka 文档

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

虽然无法更改路由使用的调度程序,但可以微调使用的执行程序。默认情况下,使用fork-join-dispatcher并且可以按照 Dispatchers [AJ:我相信这是一个错字,它们的意思是 fork-join-executor]中的说明进行配置。在期望路由执行阻塞操作的情况下,将其替换为线程池执行器可能会很有用,该线程池执行器显式提示分配的线程数

来自 Akka 文档的配置示例:

akka.actor.deployment {
  /parent/router10b {
    router = balancing-pool
    nr-of-instances = 5
    pool-dispatcher {
      executor = "thread-pool-executor"

      # allocate exactly 5 threads for this pool
      thread-pool-executor {
        core-pool-size-min = 5
        core-pool-size-max = 5
      }
    }
  }
}

池大小与路由数量匹配的线程池执行器似乎可以工作,但问题是:我如何动态(在运行时)设置我的线程池执行器的池大小以匹配路由数量,如果必须在配置中明确设置池大小?

此外,是否可以在从配置中提取其路由的执行程序时创建平衡池(在代码中)?即我不想使用配置来定义我的路由器,我想使用:

val myRouter = BalancingPool(x).props(Props[Worker])...)

但以某种方式指定要使用的执行程序(来自配置),使用与 withMailbox() 或 withDispatcher() 相同的样式

由于平衡调度程序是“驱动:java.util.concurrent.ExecutorService”,是否可以创建一个 ExecutorService 并将其传递给平衡池路由器或其调度程序?

4

1 回答 1

0

也许是这样的:

val bp = BalancingPool(instances, routerDispatcher = "pinned-dispatcher")
val myRouter = context.actorOf(Props...)
    .withRouter(bp),
  name = "myRouter")
于 2016-12-22T22:14:41.263 回答