【问题标题】:Akka - DispatchersAkka - 调度员
【发布时间】:2019-10-27 14:28:03
【问题描述】:

我一直在阅读文档,但我不太清楚每个演员是否只有一个 Dispatcher 或只有一个。假设我有演员 SendSmsActor 和演员 UpdateSmsActor,他们都会使用默认调度程序吗?还是每个 Actor 都会有自己的默认调度程序实例?此外,如果我有 500 个传入请求(作为批处理的一部分)并且我的并行度最大值设置为 300,我也不是很清楚,这 300 个线程是否会在 SendSmsActor 和 UpdateSmsActor 之间拆分?

【问题讨论】:

  • 是的,除非您明确指定,否则两者都将使用默认调度程序,您可以说将有 300 个线程,但这不会并行工作,因为并行性取决于您拥有的核心数量。上下文切换。

标签: multithreading scala concurrency akka


【解决方案1】:

默认情况下,Akka 使用默认调度程序在线程上执行参与者。 dispatcherActor System 中的所有参与者都是通用的。 Akka 还提供了编写自定义调度程序的选项。您可以在调度程序中指定执行程序的类型。

线程不会在参与者之间拆分。调度程序中可用的任何空闲线程都将用于执行actor

默认调度器配置为:

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?

【讨论】:

    【解决方案2】:

    你的两个actor都将在默认调度器上执行,除非你明确地为actor实例分配一个替代调度器,无论是通过配置还是编程。

    默认的 fork-join 调度程序将在线程之间对您的 Actor 进行负载平衡。但是,throughput 选项将决定在切换到另一个参与者之前,每个参与者应该处理多少消息。

    根据您的工作负载,300 个调度程序线程可能是最佳的,也可能不是最佳的。如果您的演员完全无阻塞,那么您可能希望每个 CPU 核心大约有 1 个线程作为起点,然后进行一些基准测试以微调该数字。否则,您将浪费 CPU 周期进行不必要的上下文切换。如果您的 actor 阻塞,那么您可能希望提供一个单独的调度程序并将您的阻塞 actor 配置为使用该调度器。见Blocking Needs Careful Management

    【讨论】:

    • 嗨 Eric,感谢您的回复,我得到了一些正在使用 REST API 的 SendNotificationActor(因此是一个阻塞操作),我正在考虑为此创建一个新的调度程序,是否必须具有固定池大小的线程池执行器?或者它可以是一个 fork-join-executor 吗?感谢回复
    • @DiegoRamos,您应该确认您的 http 客户端是阻塞还是非阻塞。如果非阻塞,只需使用默认调度程序。如果是阻塞的,你可能想使用一个固定大小的线程池执行器来限制启动的线程数。
    • 阻塞了,为什么要使用thread-pool-executor而不是fork-join?
    • 线程池执行器将限制产生的线程数量,因此它适用于具有任意长任务延迟的 I/O 绑定任务。 fork join pool主要用于CPU密集型任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多