理解Akka中的调度程序

3

我阅读了官方网站上有关调度程序的文档,但仍然不清楚调度程序是什么。例如,它可以如下配置:

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. 这是否意味着每个演员系统只有一个配置的分发器实例?

  2. 一个分发器实例是否可以管理多个执行器(线程池、fork-join池)?

  3. 如果每个配置的分发器只有一个实例,不同的演员(可能在不同的节点上)如何与其交互?

1个回答

5
最简单的想法是把调度程序看作一个线程池(它确实是这样),用于运行您的演员。根据您的演员的性质,您可以在 fork-join 线程池上运行它们(最常见的情况),也可以在 CachedThreadPool 上运行它们(如果您正在执行 IO 等操作)。我强烈推荐阅读this解释线程池的文章。
回答具体问题:
1. 是的,您每个配置条目都有一个 Dispatcher 实例。您可以拥有任意数量的配置(尽管拥有多个调度程序可能不太实际)。实际上,您描述的配置会创建一个命名的 Dispatcher 实例。
2. 调度程序是 Executor 的一种包装器(据我所知),以便与演员 API 进行通信。因此,一个调度程序意味着一个执行程序。
3. 有一个默认的系统调度程序,当未明确指定其他调度程序时,演员将使用它。您引用的文档说明了如何在非默认调度程序上运行演员,无论是通过 API 还是通过配置。我不太理解问题中的“不同节点”部分。调度程序是 JVM 中的概念。当演员跨节点通信时,使用的调度程序并不重要。如果这不能回答您的问题,请澄清一下。
您可以使用上述配置创建多个相同类型的调度程序。

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