2017-01-12 5 views
1

Я немного растерялся относительно того, какую ответственность принимает Акка при создании актерской системы. Я хочу иметь простое приложение родительского и двух дочерних актеров, где каждый ребенок находится на другом процессе (и, следовательно, на другом узле). Теперь я знаю, что могу использовать маршрутизатор с удаленной конфигурацией или просто запускать удаленный актер, но (и исправить меня, если я ошибаюсь) при создании этого удаленного актера 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 может перезапустить этот процесс/узел при сбое процесса?

ответ

1

Вы несете ответственность за создание, мониторинг и перезапуск систем актеров. Акка несет ответственность только за актеров в этих актерских системах.

+0

У вас есть ссылка в документации на это? Я не видел, чтобы это упоминалось где-то –

+0

Это подразумевается в документах. Акка не обрабатывает нерест или перезапуск JVM. Это выходит за рамки. – Ryan

+0

Так что скажем, что я хочу создавать дочерние актеры на разных jvms, тогда, если мне придется сам порождать процесс (и этот процесс будет запускать 'ActorSystem (« mySys »)' с помощью 'akka.remote.netty.tcp. port = 0'), то как родитель узнает, на каком порте этот процесс запускается, чтобы он мог развернуть дочерний актер на нем? кажется странным, что Акка, которая имеет базовую структуру менеджеров-менеджеров, не справляется с ситуацией с удаленными работниками (где число рабочих динамично, поэтому процессы не могут быть инициированы в продвинутом состоянии) –

0

Это не только невозможно с Akka, но в целом процесс не может просто порождать новый процесс на другой машине. Подумайте о последствиях безопасности, если это возможно! Вам всегда нужен какой-то существующий процесс на целевой машине, который порождает новый процесс для вас, например sshd или некоторый менеджер ресурсов/кластеров.

Итак, без пароля SSH + сценарий оболочки обычно делается для запуска рабочих процессов, например, Hadoop, Spark и Flink (последние два с использованием Akka под капотом, между прочим).

 Смежные вопросы

  • Нет связанных вопросов^_^