Я немного растерялся относительно того, какую ответственность принимает Акка при создании актерской системы. Я хочу иметь простое приложение родительского и двух дочерних актеров, где каждый ребенок находится на другом процессе (и, следовательно, на другом узле). Теперь я знаю, что могу использовать маршрутизатор с удаленной конфигурацией или просто запускать удаленный актер, но (и исправить меня, если я ошибаюсь) при создании этого удаленного актера Akka ожидает, что процесс уже существует, и узел уже запущен этот процесс, а затем его единственное развертывание этого дочернего актера на этом узле. Нет ли способа сделать Акку для нереста для нас?Сделать Akka порождением процесса для удаленного узла
Это код, который не работает, потому что я не создал этот процесс сам:
application.conf:
akka {
remote.netty.tcp.port = 2552
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
}
child {
akka {
remote.netty.tcp.port = 2550
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
}
}
Parent.scala:
object Parent extends App{
val system = ActorSystem("mySys")
system.actorOf(Props[Parent],"parent")
}
class Parent extends Actor with ActorLogging{
override def preStart(): Unit = {
super.preStart()
val address = Address("akka.tcp", "mySys", "127.0.0.1", 2550)
context.actorOf(Props[Child].withDeploy(Deploy(scope = RemoteScope(address))), "child")
}
override def receive: Receive = {
case x => log.info(s"Got msg $x")
}
}
и Child.scala:
class Child extends Actor with ActorLogging{
override def receive: Receive = {
case x=> //Ignore
}
}
Но если я запускаю этот главный в Child.scala сразу же после запуска основной на Parent.scala:
object Child extends App{
ActorSystem("mySys", ConfigFactory.load().getConfig("child"))
}
class Child extends Actor with ActorLogging{
override def receive: Receive = {
case x=> //Ignore
}
}
Затем узел соединит.
Если это не так, то как Akka может перезапустить этот процесс/узел при сбое процесса?
У вас есть ссылка в документации на это? Я не видел, чтобы это упоминалось где-то –
Это подразумевается в документах. Акка не обрабатывает нерест или перезапуск JVM. Это выходит за рамки. – Ryan
Так что скажем, что я хочу создавать дочерние актеры на разных jvms, тогда, если мне придется сам порождать процесс (и этот процесс будет запускать 'ActorSystem (« mySys »)' с помощью 'akka.remote.netty.tcp. port = 0'), то как родитель узнает, на каком порте этот процесс запускается, чтобы он мог развернуть дочерний актер на нем? кажется странным, что Акка, которая имеет базовую структуру менеджеров-менеджеров, не справляется с ситуацией с удаленными работниками (где число рабочих динамично, поэтому процессы не могут быть инициированы в продвинутом состоянии) –