У меня есть приложение Akka, имеющее несколько узлов в кластере. На каждом узле работает набор разных Актеров, то есть не все узлы одинаковы - существует некоторое дублирование для избыточности.

Я пробовал такой код, чтобы получить ссылку для связи с Актером на другом узле:

val myservice = context.actorSelection("akka.tcp://ClusterSystem@127.0.0.1:2552/user/myService")

Это работает, потому что на узле по этому адресу работает Актер с именем myService. Это похоже на простое Akka Remoting, а не на кластеризацию, потому что адрес является двухточечным.

Я хочу спросить кластер: «Эй! У кого-нибудь есть ActorRef по пути« / user / myService »?» И получить обратно одну или несколько ссылок (в зависимости от того, сколько существует избыточных копий). Тогда я мог бы использовать этот селектор для общения.

1
Greg 13 Мар 2018 в 23:00

2 ответа

Лучший ответ

Рассмотрите возможность использования Cluster Sharding, что избавит от необходимости знать где именно в кластере расположены ваши актеры:

Шардинг кластера полезен, когда вам нужно распределить акторов по нескольким узлам в кластере и вы хотите иметь возможность взаимодействовать с ними, используя их логический идентификатор, но не заботясь об их физическом расположении в кластере, которое также может меняться со временем.

С Cluster Sharding вам не нужно знать путь актера. Вместо этого вы взаимодействуете с акторами ShardRegion, которые делегируют сообщения соответствующему узлу. Например:

val stoutRegion: ActorRef = ClusterSharding(system).shardRegion("Stout")
stoutRegion ! GetPint("guinness")
1
Jeffrey Chung 13 Мар 2018 в 22:15

Если вы не хотите переключаться на сегментирование кластера, но используете текущую структуру развертывания, вы можете использовать ClusterReceptionist, как описано в ClusterClient docs.

Однако в этом случае вам придется зарегистрировать актеров у администратора, прежде чем они будут обнаружены клиентами.

0
Michal Borowiecki 14 Мар 2018 в 10:20