2016-11-13 42 views
0

我正在使用akka路由器来创建角色。什么是设置nr-of-instances的最佳方式?我的演员唯一的目的是插入数据到数据库,所以我想有尽可能多的并行演员在尽可能地运行。这只是一个任意数字吗?最大值是多少?什么是在阿卡路由器中设置实例的最佳方式

这是路由器的配置:

akka { 
    actor{ 
    deployment { 
     /Master/router9 { 
      router = smallest-mailbox-pool 
      nr-of-instances = ??? 

     } 
    } 
    } 
} 

回答

0

演员如何与线程这个答案可能会给你一个更好的想法:How are akka actors implemented on underlying threads?

随着越来越多的演员们创建的JVM堆将越来越大,但我不认为路线数量有任何硬性限制。我认为应根据您自己的测试来选择实例的数量。您可用的线程数量以及线程闲置的频率可能会影响您的决定。

0

那么除了机器的功能以及您正在运行多少其他功能之外,还没有真正的最大值。如果你有足够的资源可以运行10米。然而,如果你想要运行很多演员,我会说你可能有一个很重要的阻塞问题,或者你不了解演员如何使用这个池。

部署的actor不拥有像旧线程池执行程序模式那样的线程。它只在处理消息时使用线程,然后在处理消息时将线程退回给调度程序。这样调度员重新使用这些线程。因此,池中演员人数的配置将取决于您是否可以从演员中获得带宽。如果您的邮件太少,将开始在收件箱中进行备份,如果您的邮件太多,您可能会将这些资源用于其他内容。你会惊讶于你很少有演员需要用多线程执行者来满足你之前正在做的事情。

现在,如果您在这些参与者中有很长时间的运行进程,那么您应该考虑将这些进程卸载到存在的进程中,以便处理这个长时间运行的进程。比方说,例如,您的演员将主要处理需要几毫秒才能完成的普通数据库操作,但您发送的一对消息会调用分析数据库搜索,可能需要10到30秒才能返回。在计算方面,这是一个永恒。因此,对于这些进程,最好让数据库角色分离Per-Task Actor。这是一个演员,只存在于服务某个特定的请求,然后在回送响应后自行停止。一般过程如下:

context.actorOf(Props(classOf[PerTaskActor], sender(), message) 

这将创建一个新的演员这个演员。如果您想创建顶级actor,请调用system.actorOf(...)。构造函数看起来像:

class PerTaskActor(replyTo: ActorRef, msg: MyLongProcessMessage) { 
// .... 
} 

然后男主角里面我们运行的过程中,完成后:

replyTo.tell(result) 
context.stop(self) 

这样您的长时间运行的任务被卸载。我会建议你不要让这些演员的脆弱演员的孩子,可以崩溃很多,因为如果父演员崩溃,它会取消所有的孩子。你可能需要一个特殊的父母角色(而不是路由角色)。

相关问题