2013-06-19 80 views
2

我已經多次通過文檔(http://doc.akka.io/docs/akka/2.1.4/scala/remoting.html),並通過這裏的例子(https://github.com/akka/akka/tree/master/akka-samples/akka-sample-remote)和其他人,我仍然無法弄清楚如何做我的想做。我找到的最接近的答案是這樣的:how to start remote actors in scala,但似乎比我想象的要不便得多。沒有一個新的ActorSystem遠程創建一個Akka演員

我有一個12臺機器的集羣工作。我想沿着線的東西:

val system = ActorSystem("DistributedSystem", ConfigFactor.load.getConfig("distsys")) 
val master = system.actorOf(Props(new Master(...)), "master") 

,然後主內,東西線沿線的:

override def preStart() = { 
    for (i <- 0 until 11) { 
     // I want each of these actors to be created remotely on 
     // a different machine 
     context.actorOf(Props(new RemoteChild(...)), s"child$i") 
    } 
} 

看起來這將是一個相當常見的情況。是否有我缺少的東西,或者是否有一種很好的方法來實現這一點(根據我的配置應該是什麼樣子,或者我真正需要多少個ActorSystems)?我現在正在努力綜合一個好的解決方案。

+1

如果你不想在目標節點上啓動JVM,那麼你如何期望它能夠工作?必須在需要定位遠程部署的節點上運行Akka系統,並且該遠程系統還必須配置遠程處理,以便監聽諸如此類的請求。所有你需要做的是,其餘的可以只是配置,說當你開始一個特定的演員,它的目標是一個特定的遠程節點。在引擎蓋下發生的事情很簡單。您是否期望Akka能夠爲您在遠程節點上奇蹟般啓動JVM? – cmbaxter

+0

我刪除了這部分問題。我不知道我在期待什麼。我是否需要爲每臺可能想要生成ActorSystem的計算機分別配置一部分配置?或者,因爲他們都在做同樣的事情,我的IP地址遵循格式192.168.1。{n},其中n從1到12,它是否可以動態地確定主機運行的是什麼,以便在我的本地程序可以通過使用第n個遠程參與者在主機192.168.1。{n}上的規則訪問遠程參與者?我有什麼意義嗎? –

回答

2

我覺得你想要做的是將一組角色部署到一組遠程節點,然後將它們放在本地路由器後面,並將消息傳遞給路由器,並讓它將作業傳送到遠程節點。要做到這一點,你可以嘗試這樣的事:

val addresses = for(i <- 1 until 12) 
    yield AddressFromURIString(s"akka://[email protected]$i:2553") 

val routerRemote = system.actorOf(Props[RemoteChild].withRouter(
    RemoteRouterConfig(RoundRobinRouter(12), addresses))) 

這是假設你有這些節點上運行與ActorSystemRemoteSys阿卡和它的使用遠程配置端口2553當您發送郵件到routerRemote ref,它現在將在12個工作節點上循環發送消息。