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

我现在已经多次阅读文档(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)

2 years ago

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

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)))

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