在没有新的ActorSystem的情况下远程创建一个Akka actor

时间:2013-06-19 04:40:23

标签: scala jvm akka actor remote-actors

我现在已多次阅读文档(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,但它似乎比我认为的更不方便。

我有一组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 个答案:

答案 0 :(得分:2)

我认为你想要做的是将一组演员部署到一组远程节点,然后将它们放在本地路由器后面并将消息传递给路由器,让它将工作分配到远程节点。要做到这一点,你可以尝试这样的事情:

val addresses = for(i <- 1 until 12) 
  yield AddressFromURIString(s"akka://RemoteSys@192.168.1.$i:2553")

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

这假设您在那些名为ActorSystem RemoteSys的节点上运行Akka,并且正在使用为端口2553配置的远程处理。当您向routerRemote引用发送消息时,它现在将循环路由12个工作节点上的消息。