Выберите удаленного актера на случайном порту

В Scala, если я регистрирую удаленного актера с помощью live(0), актор регистрируется на случайном порту. Я могу выполнить регистрацию следующим образом: register('fooParActor, self) в методе действия.

Теперь на стороне мастера/сервера я могу выбрать актера, указав порт. Нужно ли мне вручную сканировать порты, чтобы использовать случайные порты?

Проблема, которую я пытаюсь решить, состоит в том, чтобы создать n актеров на узле, а затем выбрать их всех в основной/серверной программе, например. запустите 10 ведомых устройств на узле x и получите список 10 удаленных акторов на узле y.

Как это делается?


person Felix    schedule 04.02.2013    source источник


Ответы (2)


Нет необходимости регистрировать различные порты для акторов. Вместо этого вам нужен один порт для всей системы акторов — точнее, для ядра akka (которое сервер тоже должен знать). См. эту страницу документации, чтобы узнать, как все это работает в деталях.

Чтобы выбрать удаленного актера, вы можете найти его по пути в системе удаленного актера, примерно так:

context.actorFor("akka://[email protected]:2552/user/someActorName/1")

В этом случае вы должны были бы создать акторы n как дочерние акторы someActorName и дать им имена от 1 до n (чтобы вы могли получить остальных через .../someActorName/2, .../someActorName/3 и т. д.).

Здесь вообще нет необходимости что-либо рандомизировать, и, учитывая то, как вы описали проблему, в этом нет необходимости и в рандомизации. Вы просто запускаете 10 актеров и нумеруете их от 1 до 10. Любые случайные числа просто излишне усложняют ситуацию.

Что касается действительно случайных портов, я могу только согласиться с sourcedelica. Вам нужен фиксированный порт для передачи случайных или какой-либо другой способ связи. Если кто-то не знает, куда общаться из-за случайного порта, это просто не сработает.

person Frank    schedule 04.02.2013
comment
Я думаю, что главное преимущество в том, что я получаю свободный порт, даже если заранее не знаю никаких свободных портов. - person Felix; 04.02.2013
comment
Кстати, я использую удаленных актеров из стандартной библиотеки 2.10. - person Felix; 04.02.2013
comment
Если вы работаете с 2.10, я должен предложить вам перейти на akka, так как actos стандартной библиотеки устарели с версии 2.10. - person Frank; 05.02.2013
comment
Откуда вы это взяли? Я нигде не вижу знаков устаревания: scala- lang.org/api/current/index.html#scala.actors.Actor scala-lang.org/api/current/ - person Felix; 06.02.2013
comment
Я нашел это: docs.scala-lang.org/overviews/ core/actors-migration-guide.html :) Если у вас есть идея о том, как я могу согласовать 2 машины на случайный порт с akka и удаленными актерами, я приму ваш ответ;) - person Felix; 06.02.2013

У вас должна быть хотя бы одна система ActorSystem с хорошо известным портом. Затем другие ActorSystems могут использовать порт 0, чтобы Akka назначала случайный порт. Ведомые ActorSystems будут иметь акторов, зарегистрированных с актером на Мастере, чтобы он знал все удаленные системы.

Если вам абсолютно необходимо, чтобы ваш мастер использовал случайный порт, он должен будет сообщить свой порт вне диапазона (используя общую файловую систему или базу данных).

person sourcedelica    schedule 06.02.2013
comment
Я представляю запуск программы на однородных машинах в кластере, поэтому им просто нужно согласовать рабочий порт. Они могут легко передать его через сетевую файловую систему после обнаружения. Будет ли доступен случайный порт? - person Felix; 06.02.2013
comment
Да, если вы используете порт 0 для удаленной настройки, Akka назначит случайный порт (см. doc.akka.io/docs/akka/2.1.0/general/, запись akka.remote.netty.port). На вашем мастере вы можете записать этот номер порта в файл сетевой файловой системы, чтобы ведомые устройства могли подключаться. См. мой ответ на stackoverflow.com/questions/14288068/ для того, как получить порт локальной системы актера. - person sourcedelica; 07.02.2013