我已经看过几次文档了(http://doc.akka.io/docs/akka/2.1.4/scala/remoting.html),这里的例子(https://github.com/akka/akka/tree/master/akka-samples/akka-sample-remote)和其他人,我仍然不知道如何做我想做的事情。我找到的最接近的答案是:如何在scala中启动远程actor,但它似乎比我想象的要不方便得多。
我有一个由12台机器组成的集群要运行。我想要一些类似这样的东西:
val system = ActorSystem("DistributedSystem", ConfigFactor.load.getConfig("distsys"))
val master = system.actorOf(Props(new Master(...)), "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)?我现在正在努力合成一个好的解决方案。
我认为听起来您想要做的是将一组参与者部署到一组远程节点,然后将它们放在本地路由器后面,并将消息传递给路由器,并让它将工作分配给远程节点。要做到这一点,您可以尝试这样做:
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个工作节点上循环路由消息。