【问题标题】:How to determine the number of actors to spawn in akka?如何确定在 akka 中生成的演员数量?
【发布时间】:2012-06-08 09:46:57
【问题描述】:

我最近开始研究 Akka 2.0 框架,并且能够让一些代码运行,生成执行简单的 oracle 数据库调用、执行简单计算等等的参与者,但是在生产中什么都没有。

我想知道的是,是否有一般的经验法则或最佳实践来确定为某些类型的任务生成多少演员?例如,我有一个包含 200 个 jdbc 连接的连接池,我是否创建一个参与者来表示每个连接?我要创建几个并使用循环方法吗?

谢谢。

【问题讨论】:

    标签: actor akka


    【解决方案1】:

    注意 numberOf(actors) != numberOf(threads)。

    您应该为每个实体创建一个参与者,否则这些实体将在线程之间共享可变状态。 Actor 模型的全部内容是它应该隔离可变状态,以便在 Actor 之间只交换不可变的消息。结果是您不再需要任何锁,并且您可以轻松推断程序的线程安全性,因为所有可变状态都在参与者中隔离,并且您可以依赖框架在需要时正确通过内存屏障,例如将演员从一个线程切换到另一个线程时。

    线程数是一个不同的主题:这取决于内核数和每个线程的阻塞系数,即它花费在等待其他线程或 I/O 子系统上的时间百分比。例如,如果您的演员正在执行 CPU 密集型计算(例如计算 Pi),那么阻塞系数将接近 0%。但是,如果您的演员主要进行 I/O,您可以轻松假设阻塞系数为 90% 或更高。

    最后,线程数可以这样计算:

    int threads = Runtime.getRuntime().availableProcessors() * 100 / (100 - blockingCoefficient)
    

    blockingCoefficient 表示 0 到 99 之间的整数百分比。

    【讨论】:

    • 在 Akka Actor 中执行阻塞操作的整个问题有点令人困惑:难道不应该为此类阻塞操作生成专用线程并保持 Actor 严格非阻塞吗?或者依赖 Akka 线程管理也是可以接受的吗?
    【解决方案2】:

    您可以创建任意数量的演员,但是,每个父母的人数限制在 20 亿左右,也不要忘记在他们完成后阻止他们。此外,不要将您的演员创建​​为顶级演员,除非他们实际上是顶级演员。 (即使用 context.actorOf 而不是 system.actorOf 在演员内部创建演员)

    【讨论】:

    • 我喜欢“每个父母限制在 20 亿左右”的部分。 :)
    • 你可以说我是一个“抱树者”
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2015-09-08
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多