Создание актера Akka удаленно без новой системы ActorSystem
Я уже несколько раз просматривал документацию ( 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, но это кажется гораздо более неудобным, чем я думаю.
У меня есть кластер из 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 ответ
Я думаю, что это звучит так, как будто вы хотите сделать, это развернуть набор действующих лиц на множестве удаленных узлов, а затем расположить их позади локального маршрутизатора и передать сообщения маршрутизатору и позволить ему обрабатывать всю работу на удаленных узлах. Чтобы сделать это, вы можете попробовать что-то вроде этого:
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 рабочих узлов.