了解akka中的调度员

时间:2016-09-08 16:39:58

标签: java scala akka

我在the official site上阅读了有关调度员的文档。但它还不清楚调度员是什么样的野兽。例如,它可以配置如下:

my-thread-pool-dispatcher {
  # Dispatcher is the name of the event-based dispatcher
  type = Dispatcher
  # What kind of ExecutionService to use
  executor = "thread-pool-executor"
  # Configuration for the thread pool
  thread-pool-executor {
    # minimum number of threads to cap factor-based core number to
    core-pool-size-min = 2
    # No of core threads ... ceil(available processors * factor)
    core-pool-size-factor = 2.0
    # maximum number of threads to cap factor-based number to
    core-pool-size-max = 10
  }
  # Throughput defines the maximum number of messages to be
  # processed per actor before the thread jumps to the next actor.
  # Set to 1 for as fair as possible.
  throughput = 100
}

问题:

  1. 这是否意味着每个actor系统的 唯一一个 实例所配置的调度程序?

  2. 调度程序的一个实例是否可以管理 多个 执行程序(线程池,fork-join池)?

  3. 如果每个已配置的调度程序只有一个实例,那么不同的角色(可能在不同的节点上)如何与之交互?

1 个答案:

答案 0 :(得分:3)

最简单的方法是将调度程序视为用于运行actor的线程池(它确实是)。根据您的actor的性质,您可以在fork-join线程池(最常见)或CachedThreadPool上运行它们(如果您是dong IO)等。我强烈推荐this文章非常好地解释线程池。

回答具体问题:

  1. 是的,每个配置条目都有一个Dispatcher实例。您可以拥有任意数量的配置(尽管拥有多个Dispatchers可能不切实际)。上面描述的有效配置会为您创建一个名为Dispatcher的实例。
  2. Dispatcher是Executor的一种包装器(据我所知),以促进与actor API的通信。所以不,一个调度员意味着一个执行者。
  3. 当未明确指定其他调度程序时,actor会使用默认系统调度程序。您引用的文档说明了如何通过API或通过配置在非默认调度程序上运行actor。我不太明白“不同节点”问题的一部分。调度程序是JVM中的概念。当参与者跨节点进行通信时,正在使用的调度程序不相关。如果这不能回答你的问题,请澄清。
  4. 您可以使用上面的配置创建多个相同类型的Dispatchers。