Получение Akka.NET для подключения к удаленным адресам

Все демонстрации, которые я нашел, демонстрирующие, как начать работу с удаленным взаимодействием в Akka.NET, демонстрируют простейший вариант использования, когда два участника работают на одной машине с использованием localhost.

Я пытаюсь заставить актера Akka.NET подключиться к удаленной машине и столкнулся с некоторыми трудностями.

Код очень прост:

Код клиента:

var config = ConfigurationFactory.ParseString(@"
    akka {  
        log-config-on-start = on
        stdout-loglevel = DEBUG
        loglevel = DEBUG
        actor {
            provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""

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

            deployment {
                /remoteactor {
                    router = round-robin-pool
                    nr-of-instances = 5
                    remote = ""akka.tcp://system2@xxx.australiasoutheast.cloudapp.azure.com:666""
                }
            }
        }
        remote {
            dot-netty.tcp {
                port = 0
                hostname = localhost
            }
        }
    }
");

using (var system = ActorSystem.Create("system1", config))
{
    Console.ReadLine();
}

Код сервера:

var config = ConfigurationFactory.ParseString(@"
akka {  
    log-config-on-start = on
    stdout-loglevel = DEBUG
    loglevel = DEBUG
    actor {
        provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""

        debug {  
            receive = on 
            autoreceive = on
            lifecycle = on
            event-stream = on
            unhandled = on
        }
    }
    remote {
        dot-netty.tcp {
            transport-protocol = tcp
            port = 666
            hostname = ""10.0.0.4"" //This is the local IP address 
        }
    }
}
");

using (ActorSystem.Create("system2", config))
{
    Console.ReadLine();
}

Я могу успешно подключиться, когда я запускаю процесс актера на другом компьютере в моей локальной сети, но когда я распространяю тот же простой пример на облачную виртуальную машину, я получаю следующую ошибку:

[ERROR][11/9/2017 3:58:45 PM][Thread 0008][[akka://system2/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2Fsystem1%40localhost%3A28456-1/endpointWriter#1657012126]] Dropping message [Akka.Remote.DaemonMsgCreate] for non-local recipient [[akka.tcp://system2@xxx.australiasoutheast.cloudapp.azure.com:666/remote]] arriving at [akka.tcp://system2@xxx.australiasoutheast.cloudapp.azure.com:666] inbound addresses [akka.tcp://system2@10.0.0.4:666]
Cause: Unknown

Я также попытался использовать "127.0.0.1", но это не работает ни локально, ни по сети.

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

ОБНОВЛЕНИЕ:

Я попытался использовать параметры bind-hostname и bind-port, доступные в Akka.NET, так как это должно обойти проблемы NAT, которые, по моему мнению, я испытываю. К сожалению, это тоже не работает, я пробовал различные варианты конфигурации, такие как использование имени хоста и IP-адреса, как показано ниже:

remote {
    dot-netty.tcp {     
        port = 666
        hostname = "13.73.xx.xx"

        bind-port = 666
        bind-hostname = "0.0.0.0"

    }
}

Сообщение об ошибке, которое я получаю при попытке выполнить приведенную выше конфигурацию:

[ERROR][11/12/2017 5:19:58 AM][Thread 0003][Akka.Remote.Transport.DotNetty.TcpTransport] Failed to bind to 13.73.xx.xx:666; shutting down DotNetty transport.
Cause: System.AggregateException: One or more errors occurred. ---> System.Net.Sockets.SocketException: The requested address is not valid in its context

1 ответ

Решение

Несколько замечаний:

В вашем конфиге сервера есть привязка к 0.0.0.0. (hostname = 0.0.0.0) Таким образом, сокет будет связываться со всеми локальными конечными точками, в случае, если ваша облачная среда использует несколько сетевых конечных точек. Затем используйте установить public-hostname = xxx.australiasoutheast.cloudapp.azure.com, Таким образом, имя хоста для экземпляра сервера совпадает с адресом удаленного взаимодействия, который вы используете в своем URL удаленного взаимодействия.

Обратите внимание, что публичное имя хоста (и имя хоста, если вы не используете публичное имя хоста) должно быть разрешаемым DNS.

Другие вопросы по тегам