Создание актера 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 рабочих узлов.

Другие вопросы по тегам