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炸毁系统?
同意 - 期货对于这种类型的用例非常有用。 – sourcedelica
@ericacm我不同意。如果您知道您将以相同的方式完成大量工作并需要某种错误处理(例如重新启动失败)。然后定义一组演员来处理工作似乎更可靠。演员然后接收他们应该在消息中做的工作,处理该消息并发送响应。如果某个演员崩溃(出于某种原因),您有一位主管重新启动该演员,并让其再次尝试。使用期货我相信这将是更难做(当然不是不可能,但更难)。但是,我想这取决于用例。 –
Thx澄清。有意义的是,演员比消息更昂贵。 – rompetroll