获取 Akka.NET 以连接到远程地址
Getting Akka.NET to connect to a remote addresses
我找到的所有展示如何在 Akka.NET 中开始远程处理的演示演示了最简单的用例,其中两个参与者 运行 在同一台机器上使用本地主机。
我正在尝试让 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();
}
当我 运行 本地网络上另一台机器上的 actor 进程时,我可以成功连接,但是当我将相同的简单示例分发到云 VM 上时,我收到以下错误:
[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”,但这似乎在本地或网络上都不起作用。
任何人都可以就我可能做错的地方提供任何意见吗?
更新:
我尝试使用 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
几点说明:
在您的服务器配置中将其绑定到 0.0.0.0。 (hostname = 0.0.0.0) 这样套接字将绑定到所有本地端点,以防您的云托管环境使用多个网络端点。
然后使用设置public-hostname = xxx.australiasoutheast.cloudapp.azure.com
。这样,服务器实例的主机名与您在远程处理中使用的远程处理地址相同 url。
请注意 public-主机名(和主机名,如果您不使用 public-主机名)必须是 DNS 可解析的。
我找到的所有展示如何在 Akka.NET 中开始远程处理的演示演示了最简单的用例,其中两个参与者 运行 在同一台机器上使用本地主机。
我正在尝试让 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();
}
当我 运行 本地网络上另一台机器上的 actor 进程时,我可以成功连接,但是当我将相同的简单示例分发到云 VM 上时,我收到以下错误:
[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”,但这似乎在本地或网络上都不起作用。
任何人都可以就我可能做错的地方提供任何意见吗?
更新:
我尝试使用 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
几点说明:
在您的服务器配置中将其绑定到 0.0.0.0。 (hostname = 0.0.0.0) 这样套接字将绑定到所有本地端点,以防您的云托管环境使用多个网络端点。
然后使用设置public-hostname = xxx.australiasoutheast.cloudapp.azure.com
。这样,服务器实例的主机名与您在远程处理中使用的远程处理地址相同 url。
请注意 public-主机名(和主机名,如果您不使用 public-主机名)必须是 DNS 可解析的。