2012-05-02 123 views
3

如果你想同时执行长时间运行的计算(在一台机器上),Akka演员可以提供帮助。Akka:演员产卵vs填满邮箱

一种方法是为每件作品产生新的演员。类似于

while(true) { 
    val actor = system.actorOf(Props[ProcessingActor]) 
    (actor ? msg).map { 
     ... 
     system.stop(actor) 
    } 
} 

第二个想法是在路由器后面配置一定数量的actor。然后将所有消息发送到路由器。

val router = system.actorOf(Props[ProcessingActor].withRouter(RoundRobinRouter(nrOfInstances = 5))) 
while(true) { 
    (router ? msg).map { ... } 
} 

我想知道,如果系统过载(传入消息的速率高于处理速率),这会更好吗?

哪个更长?而且最终都会用OOMError炸毁系统?

回答

4

在为每个任务创建新的Actor之前,您还可以使用Future。这真的取决于你想达到什么。要使用最少的内存使用来完成尽可能多的工作,您应该使用actor/router方法。期货更为昂贵,因为每项任务都会创建FuturePromise的新实例。但是这取决于你的用例,哪种方法更好。当我真的不需要他们时,我不会创造出很多演员。尤其是system.actorOf总是会创建一个新的错误内核。

+0

同意 - 期货对于这种类型的用例非常有用。 – sourcedelica

+2

@ericacm我不同意。如果您知道您将以相同的方式完成大量工作并需要某种错误处理(例如重新启动失败)。然后定义一组演员来处理工作似乎更可靠。演员然后接收他们应该在消息中做的工作,处理该消息并发送响应。如果某个演员崩溃(出于某种原因),您有一位主管重新启动该演员,并让其再次尝试。使用期货我相信这将是更难做(当然不是不可能,但更难)。但是,我想这取决于用例。 –

+0

Thx澄清。有意义的是,演员比消息更昂贵。 – rompetroll