2015-09-02 2 views
3

Использование akka (.net) Я пытаюсь реализовать простой случай использования кластера.Кластер Akka (.net) с удаленными узлами: исключенное исключение

  1. Кластер - для узлов вверх/вниз событий.
  2. Remote - для отправки сообщения конкретному узлу.

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

Address address = new Address("akka.tcp", "ClusterSystem", "master", 8080); 
cluster.Join(address); 

Когда ClusterEvent.MemberUp сообщение reseived Master Node создания актера ссылка:

ClusterEvent.MemberUp up = message as ClusterEvent.MemberUp; 
ActorSelection nodeActor = system.ActorSelection(up.Member.Address + "/user/slave_0"); 

Отправка сообщения этого актера вызывает ошибку:


ассоциации с удаленной системой akka.tcp : // ClusterSystem @ slave: 8090 не удалось; адрес теперь закрыт на 5000 мс. Причина: [диссоциированный]


мастер конфигурация:

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

     remote { 
      helios.tcp { 
       port = 8080 
       hostname = master 
       bind-hostname = master 
       bind-port = 8080 
       send-buffer-size = 512000b 
       receive-buffer-size = 512000b 
       maximum-frame-size = 1024000b 
       tcp-keepalive = on 
      } 
     } 
     cluster{ 
      failure-detector { 
       heartbeat - interval = 10 s 
      } 
      auto-down-unreachable-after = 10s 
      gossip-interval = 5s 
     } 
     stdout-loglevel = DEBUG 
     loglevel = DEBUG 

     debug {{ 
      receive = on 
      autoreceive = on 
      lifecycle = on 
      event-stream = on 
      unhandled = on 
     }} 
    } 

раб конфигурация:

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

    remote { 
     helios.tcp { 
      port = 8090 
      hostname = slave 
      bind-hostname = slave 
      bind-port = 8090 
      send-buffer-size = 512000b 
      receive-buffer-size = 512000b 
      maximum-frame-size = 1024000b 
      tcp-keepalive = on 
     } 
    } 
    cluster{ 
     failure-detector { 
      heartbeat - interval = 10 s 
     } 
     auto-down-unreachable-after = 10s 
     gossip-interval = 5s 
    } 
    stdout-loglevel = DEBUG 
    loglevel = DEBUG 

    debug {{ 
     receive = on 
     autoreceive = on 
     lifecycle = on 
     event-stream = on 
     unhandled = on 
    }} 

} 
+0

Так вы используете Akka.Cluster и Akka.Remote взаимозаменяемо? То есть используя Remote для подключения к узлам, которые не являются частью кластера? – Aaronontheweb

+0

Нет, все узлы являются частью кластера. Мне нужен RPC-путь для каждого узла в кластере. Есть ли другой способ отправить сообщение на конкретный узел кластера вместо actorRef.Tell()? – qrux

ответ

2

Вот ваша проблема:

cluster{ 
      failure-detector { 
       heartbeat - interval = 10 s 
      } 
      auto-down-unreachable-after = 10s 
      gossip-interval = 5s 
     } 

сердцебиение интервал и автоматическая вниз-недостижимые после того же времени - ther так как ваши узлы почти всегда будут автоматически отключать через 10 секунд, потому что вы делаете ставку на состояние гонки, которое может потерять детектор отказа.

auto-down-unreachable-after - опасная установка - не используйте ее. У вас будет расколотый мозг или еще хуже.

И убедитесь, что интервал обнаружения неисправности всегда ниже, чем ваш интервал автоматического понижения.

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