如何确定在akka中产生的演员数量?

时间:2012-06-04 09:45:36

标签: actor akka

我最近开始研究Akka 2.0框架,并且能够运行一些代码,生成执行简单oracle数据库调用的actor,执行简单的计算等等,但是生产中没有任何东西。

我想知道的是,是否有一般的经验法则或最佳实践来确定为某些类型的任务产生多少个演员?比方说,我有一个200 jdbc连接的连接池,我是否创建了一个代表每个连接的actor?我是否创建了一些并使用循环法?

感谢。

2 个答案:

答案 0 :(得分:8)

请注意numberOf(演员)!= numberOf(threads)。

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

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

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

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

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

答案 1 :(得分:4)

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