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

Используя akka (.net), я пытаюсь реализовать простой вариант использования кластера.

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

Есть два участника: главный узел, который прослушивает события кластера, и подчиненный узел, который подключается к кластеру.

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

Когда сообщение ClusterEvent.MemberUp пересылается, ссылка на актера, создающего главный узел:

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
    }}

}

person qrux    schedule 02.09.2015    source источник
comment
Так вы взаимозаменяемо используете Akka.Cluster и Akka.Remote? Т.е. с помощью Remote для подключения к узлам, не входящим в кластер?   -  person Aaronontheweb    schedule 02.09.2015
comment
Нет, все узлы являются частью кластера. Мне нужен способ RPC для каждого узла в кластере. Есть ли другой способ отправить сообщение конкретному узлу кластера вместо ActorRef.Tell ()?   -  person qrux    schedule 03.09.2015


Ответы (1)


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

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

heartbeat-interval и auto-down-unreachable-after имеют одинаковую продолжительность - поэтому ваши узлы почти всегда автоматически отключаются через 10 секунд, потому что вы делаете ставку на состояние гонки, которое детектор сбоя может проиграть.

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

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

person Aaronontheweb    schedule 03.09.2015