2016-02-25 2 views
5

В кластерной среде у меня есть начальный узел и node1 и node2.Akka.net: Доступ к удаленным актерам в кластере

От узла1 Я хочу отправить сообщение Актеру, созданному на узле2. Локальный путь к этому узлу на узле2 - это akka: MyAkkaSystem/user/AnActor.

Теперь я хочу, чтобы отправить сообщение от актера от node1 к этому конкретному актеру, используя ActorSelection подобное:

var actorSystem = ActorSystem.Create("MyTestSystem"); 
var c = actorSystem.ActorSelection("/user/ConsoleReceiver"); 
c.Tell("Hello World"); 

На NODE2 актер был создан так:

var actorSystem = ActorSystem.Create("MyTestSystem"); 
      var r = actorSystem.ActorOf(Props.Create<MessageReceiver>(), "ConsoleReceiver"); 
      Console.WriteLine(r.Path); 
      Console.ReadLine(); 
      actorSystem.Terminate().Wait(); 

К сожалению, это не сработает, так как попытка заканчивается мертвыми буквами.

Конфигурация HOCON на node2 выглядит следующим образом:

akka { 
    actor { 
     provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"     
     deployment {     
     }    
    } 

    remote { 
     log-remote-lifecycle-events = DEBUG 
     log-received-messages = on 

     helios.tcp { 
     transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote" 
      applied-adapters = [] 
      transport-protocol = tcp  
     hostname = "127.0.0.1" 
     port = 0 
     } 
    }    

    cluster { 
     #will inject this node as a self-seed node at run-time 
     seed-nodes = ["akka.tcp://[email protected]:4053"] #manually populate other seed nodes here, i.e. "akka.tcp://[email protected]:4053", "akka.tcp://[email protected]:4044" 
     roles = [crawler] 
    } 
    } 

Как узел семян я использую маяк. С точки зрения подключения все, кажется, работает. Семя найдено, и каждый полученный узел получил приветственное сообщение.

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

ответ

5

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

Это не так просто. Рассмотрим следующий сценарий: Что делать, если вы создали актера на обоих узлах по тому же пути. Если вы попытаетесь использовать относительный путь - не указывая, какой узел вы имеете в виду - какой из участников должен получить сообщение?.

Используя основные возможности кластера, вы можете легко выбрать узел, используя Context.ActorSelection(_cluster.ReadView.Members.Single(m => /* which node you want to choose */).Address + "/user/ConsoleReceiver");. Расширение кластера дает вам данные просмотра с информацией о всех членах, видимых с текущего узла.

Существует множество способов отправить сообщение другому актеру, не зная, на каком узле он живет.

Первый подход заключается в использовании функции Akka.Cluster.Toolscluster singleton - она ​​позволяет создавать не более одного экземпляра актера, присутствующего в кластере. В случае сбоев узлов он будет мигрировать на другой узел. Имейте в виду, что это решение не должно использоваться, если вы хотите, чтобы многие участники работали таким образом. Это больше для отдельных, особых игроков.

Второй подход заключается в использовании функции Akka.Cluster.ToolsDistributed Pub/Sub, позволяющей передавать широкомасштабные события в масштабах всего сообщества участников кластера, подписавшись на конкретную тему, не беспокоясь об их фактическом местоположении. Это хороший выбор для сценариев вещания.

Последний подход заключается в использовании функции Akka.Cluster.Sharding, которая автоматически управляет жизненным циклом актеров - вам не нужно явно создавать актеры - она ​​также может направлять сообщения им из любого места в кластере и может перебалансировать их по многим узлам кластера, когда это необходимо ,

+0

Хорошо спасибо. Однако я думал, что узлы связаны друг с другом из-за кластерных сплетен. Итак, если узлы связаны, почему я не могу обратиться к ним напрямую? –

+0

Что вы подразумеваете под этим? В первом абзаце я описал прямой доступ к актеру на узле. – Horusiath

+0

Ну, похоже, вам пришлось пройти долгий путь, чтобы добраться до удаленных участников, запросив кластер, синглтон, осколки, паб/суб и т. Д. (Которые являются отличными функциями). Но поскольку узлы подключены уже, нет более простого способа, говоря: ActorSelection ([роль узла]/[путь к актеру]) или сделать его прозрачным с некоторой изящной магией HOCON на стороне клиента? –

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