我一直在阅读文档,但是对于每个演员只有一个Dispatcher还是只有一个,我还是不太清楚。可以说我有演员SendSmsActor和演员UpdateSmsActor,他们都将使用默认调度程序吗?还是每个Actor都会获得自己的默认调度程序实例?同样,对于我来说,是否还有500个传入请求(作为批处理的一部分),并且我的parallelism-max设置为300,这300个线程是否会在SendSmsActor和UpdateSmsActor之间分配?
答案 0 :(得分:1)
默认情况下,Akka
使用默认的调度程序在线程上执行角色。 dispatcher
对于Actor System
中的所有参与者都是通用的。 Akka还提供了编写自定义调度程序的选项。您可以在调度程序中指定执行程序的类型。
线程不会在参与者之间分配。调度程序中可用的任何可用线程都将用于执行给参与者
默认调度程序配置为:
default-dispatcher {
type = "Dispatcher"
executor = "fork-join-executor"
fork-join-executor {
parallelism-min = 8
parallelism-factor = 3.0
parallelism-max = 64
}
thread-pool-executor {
keep-alive-time = 60s
core-pool-size-min = 8
core-pool-size-factor = 3.0
core-pool-size-max = 64
max-pool-size-min = 8
max-pool-size-factor = 3.0
max-pool-size-max = 64
task-queue-size = -1
task-queue-type = "linked"
allow-core-timeout = on
}
}
参考:What are the default Akka dispatcher configuration values?
答案 1 :(得分:1)
除非您通过配置或编程方式为actor实例显式分配替代调度程序,否则两个actor都将在默认调度程序上执行。
默认的fork-join调度程序将在线程之间平衡Actor的负载。但是,throughput
选项将确定每个角色在切换到另一个角色之前应处理多少条消息。
取决于您的工作量,300个调度程序线程可能是最佳选择,也可能不是最佳选择。如果您的参与者是完全非阻塞的,那么您可能希望每个CPU核心大约有1个线程作为起点,然后进行一些基准测试以微调该数字。否则,您将浪费CPU周期进行不必要的上下文切换。如果您的actor阻止了,那么您可能想提供一个单独的调度程序,并将您的阻止actor配置为使用该调度器。参见Blocking Needs Careful Management。