2012-07-17 22 views
2

有沒有人有任何建議如何管理大量的akka​​演員的創建?Akka Actor設置:在Main方法中還是在'Manager'類中?

我的新中間件項目目前包含約10名演員,但隨着時間的推移,這將不可避免地增長到很高的數量。我在我的main函數中創建了所有演員,但隨着系統的增長,這可能會失控,並且功能跨越整個屏幕。

我當然可以將所有創建者創建爲獨立類中的函數,但這並不能真正解決問題。

我不確定是否有任何模式可用來幫助管理此設置過程?

回答

3

正常情況下應該有,但幾個頂級演員(由使用system.actorOf即創建的)。這是因爲如果所有參與者都可能破壞其他人的行爲,那麼你的容錯能力就很差。所以你應該做的是考慮你想如何在應用程序中包含失敗,然後使用context.actorOf創建演員作爲其他演員的子代。

+0

在編寫單元測試時,是否使用context.actorOf直接難以嘲笑這些actor?我有幾個單元測試,我使用TestProbe確保消息正確轉發。爲了促進這一點,我在構造函數中有actorRef參數。 – Michael 2012-07-18 11:29:46

+0

我推薦文檔:http://doc.akka.io/docs/akka/snapshot/scala/testing.html – 2012-07-18 15:08:23

2

這真的取決於演員的關係。如果他們彼此之間沒有父母/子女關係,那麼開始他們的地點並不重要。如果他們有這樣的關係,你應該在你父母的內部啓動你的演員,因爲你必須使用父演員的context來創建另一個演員作爲它的孩子。

1

如果不知道更多關於您正在創建的演員的性質,很難回答您的問題。例如,如果可以在邏輯組的演員,我會做這樣的事情:

def initialize() = { 

    // Initialize Misc actors 
    val foo = FooActor() 
    val bar = BarActor() 

    initializeActorsThatDoStuff() 
    initializeActorsThatDoOtherStuff() 

} 

如果他們有一個父/子關係,@drexin建議你應該做的。


編輯:差點忘了:我要創建同一類型的不同參數的多個演員,當然我會使用一個循環,而不是複製和粘貼,例如

def initializeLotsOfActors(num:Int) = 
    for(i <- 0 to num) new ActorThatTakesAnInt(i); 

(因爲沒有人喜歡複製和粘貼:d)

+0

請注意,Akka演員不是用'new'創建的。 – drexin 2012-07-17 18:07:34

+0

對我的恥辱:)在一段時間內沒有真正寫過Scala。 – fresskoma 2012-07-17 20:19:50

+0

我的用例在這個問題中一般描述: http://stackoverflow.com/questions/11419335/managing-2-connections-in-scala-esque-fashion 我有演員幫助管理與供應商API。我想我還會有一系列演員處理從API接收的單個消息類型,以及將信息轉發給我們組織內不同IT系統的pub/sub actors。 讓我知道,如果我仍然需要更清楚一點的上下文。 – Michael 2012-07-18 09:52:09