2012-05-02 63 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