我一直在阅读文档,但我不太清楚是每个参与者都只有一个Dispatcher,还是只有一个。假设我有actor SendSmsActor和actor UpdateSmsActor,它们都会使用默认调度程序吗?或者每个Actor都有自己的默认dispatcher实例?对于我来说,如果有500个传入请求(作为批处理的一部分),并且我的parallelism-max设置为300,那么这300个线程是否会在SendSmsActor和UpdateSmsActor之间拆分?
发布于 2019-06-13 14:46:43
默认情况下,Akka使用默认调度程序在线程上执行执行元。对于Actor System中的所有参与者,dispatcher都是通用的。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?
发布于 2019-06-13 14:56:29
除非以配置或编程方式显式地为执行元实例指定替代调度程序,否则这两个执行元都将在默认调度程序上执行。
默认的fork-join调度程序将跨线程对参与者进行负载均衡。但是,throughput选项将确定在切换到另一个执行元之前每个执行元应该处理多少消息。
根据您的工作负载,300个调度程序线程可能是最优的,也可能不是最优的。如果您的参与者是完全非阻塞的,那么您可能希望每个CPU核心大约有一个线程作为起点,然后进行一些基准测试来微调这个数字。否则,您将浪费CPU周期进行不必要的上下文切换。如果你的参与者阻塞,那么你可能想要提供一个单独的调度程序,并配置你的阻塞参与者来使用它。参见Blocking Needs Careful Management。
https://stackoverflow.com/questions/56572956
复制相似问题