2015-11-05 2 views
1

У меня есть приложение Scala, где у меня несколько узлов. Каждый узел имеет ActorSystem с основным игроком, и каждый актер должен иметь некоторые ActorRef для определенных участников (например, «Узел 1» имеет «Actor3» и «Actor3» для Actor8 требуется ActorRef для «Actor7» и «Actor8» для выполнения своей работы) , Моя проблема в том, что я не знаю, имеет ли другой узел («Node2») «Actor1» или «Actor7», который я ищу.Поиск актера в кластере Akka

Моя идея состояла в том, чтобы зацикливаться на каждом членстве, используя ActorSelection несколько раз и спрашивая каждого нового участника, если у него есть актеры, которых я ищу. Это единственный способ сделать это? Разве нет более простого и эффективного способа сделать это?

+0

Если я вас не понимаю, почему бы не использовать akka cluster singleton? Cluster Singleton - Документация Akka http://doc.akka.io/docs/akka/snapshot/scala/cluster-singleton.html, вы можете хранить «Карта [Адрес, Список [ActorRef]]», как сказал Фатих Донмез или использовать этот синглтон для запуска детского работника с использованием удаленного маршрутизатора. – mingchuno

ответ

1

Альтернативный подход к ActorSelection может быть справочной таблицей. Если вам нужно сделать много выбора актера, а создание актера не так динамично, это может быть лучшим решением.

На каждом узле вы можете создать структуру данных, такую ​​как Map[String,List[String]] Первый ключ - это имя узла и значение списка для референтных ссылок в этом узле.

Trick - это когда любой узел имеет изменения для своих участников (создание, остановка), другой актер должен замечать другие узлы об изменениях, чтобы любые узлы имели синхронизированную обновленную карту.

Если вы гарантируете это, то каждый узел может найти существование актера;

map.get(nodeName) match { 
    case Some(n) => n.contains(actorName) 
    case None => false 
} 
+0

Но в MemberUp у меня есть доступ только к параметру «member», и он немного ограничен. Я не совсем понял, как обращаться с этой картой. –

+0

Тогда как вы будете делать actorselection? Вы должны иметь идентификатор для удаленного выбора. Я предположил, что вы можете отправить сообщение узлу {id}/commandActor. CommandActor обрабатывает операции с картами, и каждый узел создает его. –

+0

Я знаю имена актеров, которые мне нужны, поэтому идея заключалась в том, чтобы использовать в MemberUp следующую строку: 'context.system.actorSelection (RootActorPath (member.address) /" user "/ actorName);' –

1

Я решил очень похожую проблему в нашем кластере, имея DiscoveryActor на известном пути на каждом узле. Протокол DiscoveryActor имеет

Register(name, actorRef) 
Subscribe(name) 
Up(name, actorRef) 
Down(name, actorRef) 

Каждый имени актер посылает Register своим местным DiscoveryActor, который в свою очередь транслирует Up ко всем местным абонентов и все другие DiscoveryActor «S на другие узлы, которые, в свою очередь, транслировать их абонентов

в DiscoveryActor часы MemberUp/MemberDown, чтобы определить, когда искать нового партнера DiscoveryActor и транслировать свои локальные регистрации или транслировать Down для регистрации сбитых сверстников.

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