我最近开始研究 Akka 2.0 框架,并且能够运行一些代码,生成执行简单的 oracle 数据库调用的参与者,执行简单的计算等等,但是在生产中什么都没有。
我想知道的是,是否有一般的经验法则或最佳实践来确定为某些类型的任务产生多少演员?例如,我有一个包含 200 个 jdbc 连接的连接池,我是否创建一个参与者来表示每个连接?我是否创建了一些并使用循环方法?
谢谢。
请注意 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之间的整数百分比。
您可以创建任意数量的演员,但是,每个父母的人数限制在 20 亿左右,也不要忘记在他们完成后阻止他们。此外,不要将您的演员创建为顶级演员,除非他们实际上是顶级演员。(即使用 context.actorOf 而不是 system.actorOf 在演员内部创建演员)