【问题标题】:Using custom dispatcher for all user actors in Akka to avoid thread starvation for system actors为 Akka 中的所有用户 Actor 使用自定义调度程序以避免系统 Actor 的线程饥饿
【发布时间】:2019-07-31 18:17:19
【问题描述】:

问题是关于 Akka 2.5.x 中的调度程序配置。

我想避免由于系统消息未传递而可能导致节点被隔离的线程饥饿问题。为了实现这一点,我想创建与默认调度程序配置完全相同的单独调度程序。

我已经定义了名为my-dispatcher {...} 的自定义调度程序配置。我可以使用以下内容让 Akka 将此调度程序用于所有用户的演员吗?

akka.actor.deployment {
    "/**" { # <- should this work?
        dispatcher = my-dispatcher
...
}

想法来自文档中的以下示例:

# all direct children of '/user/actorC' have a dedicated dispatcher 
"/actorC/*" {
    dispatcher = my-dispatcher
}

因此,如果我将actorC 替换为**,它将针对/user 下的所有参与者,我希望它能够工作。有人这样做吗?或者我需要寻找其他解决方案?

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    据我检查,您的方法有效,它会覆盖 user 路径下所有参与者的调度程序。

    虽然配置默认调度程序的更传统方法只是覆盖akka.actor.default-dispatcher 下的配置条目(您只能覆盖其中的一些),例如:

    akka {
      actor {
        default-dispatcher {
          fork-join-executor {
            parallelism-min = 2
          }
          throughput = 100
      }
    }
    

    如果您坚持在配置中使用不同路径定义的调度程序作为默认值,您可以用my-dispatcher 覆盖default-dispatcher 部分:

    akka.actor.default-dispatcher = ${path.to.my-dispatcher}
    

    【讨论】:

    • 感谢您的回答!虽然是更传统的方法,它不会也覆盖系统参与者的调度程序吗?我想为他们配备单独的调度员
    • 我的代码 sn-p 中有一个错误,但现在已修复:) 我猜想,设置 default-dispatcher 也适用于系统参与者,但我需要在我回家时确认。
    • 无论如何,你的第一部分答案就是我想确认的。谢谢!
    • 是否更改默认调度程序不会影响 Akka 内部?为用户定义的参与者创建单独的调度程序不是最佳实践吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多