我有一个由演员组成的分布式系统,其中一些演员在Windows上,另一些演员在Linux机器上。有时候,一个演员可能需要连接其他演员并进行一些通讯。当然,有时一个演员在Windows上,而另一个演员在Linux系统上。
演员之间通过ActorSelection相互连接。问题是,当Windows演员试图与Linux演员通信时,一切都正常。但当Linux演员启动通信时,ActorSelection.ResolveOne失败了。
我在这里制作了一个小样本:
公共主机名是公开可用的IP地址。
因此,以下是情况:
- 在运行Windows / Windows时,两个实例都可以看到对方(我给他们远程地址 - 他们输出“已解析”) - 当运行Windows / Linux,并将Linux actor的地址提供给Windows actor时,它输出“已解析”。因此,Windows可以毫无问题地连接到Linux。之后,将Windows actor的地址提供给Linux actor也会输出“已解析” - 我想,连接已经建立,没有真正的握手传递。 - 但是,在运行Windiws / Linux并将Windows actor的地址提供给Linux actor时,它会显示“失败”。没有关于任何错误或丢包的消息。日志的末尾如下所示:
``` Akka.Remote.Transport.AkkaProtocolManager|now supervising akka://TestSystem/system/transports/akkaprotocolmanager.tcp.0/akkaProtocol-tcp%3A%2F%2FTestSystem%40%5B%3A%3Affff%3A192.168.0.252%5D%3A36983-1|||| 13:20:08.3766|DEBUGAkka.Remote.Transport.ProtocolStateActor|Started (Akka.Remote.Transport.ProtocolStateActor)|||| 13:20:08.3922|DEBUG|Akka.Remote.Transport.ProtocolStateActor|Stopped|||| ```
类似日志的问题在这里描述:Akka.net starting and stopping with no activity。原因是系统协议不兼容。这是相同的问题吗?从Akka.NET文档和发行说明中得出,它具有完全的Linux支持...
那么,在配置方面我是否遗漏了什么?有人能使此示例与Linux-> Windows连接一起工作吗?
演员之间通过ActorSelection相互连接。问题是,当Windows演员试图与Linux演员通信时,一切都正常。但当Linux演员启动通信时,ActorSelection.ResolveOne失败了。
我在这里制作了一个小样本:
static void Main(string[] args)
{
ActorSystem system = ActorSystem.Create("TestSystem");
system.ActorOf(Props.Create(() => new ConnectActor()), "test");
while (true)
{
var address = Console.ReadLine();
if (string.IsNullOrEmpty(address))
{
system.Terminate();
return;
}
var remoteAddress = $"akka.tcp://{system.Name}@{address}/user/test";
try
{
var actor = system.ActorSelection(remoteAddress).ResolveOne(TimeSpan.FromMilliseconds(5000)).Result;
Console.WriteLine("Resolved: " + actor.Path);
}
catch (Exception ex)
{
Console.WriteLine("Failed: " + ex.Message);
}
}
}
在 app.config 中的配置如下:
akka {
loggers = ["Akka.Logger.NLog.NLogLogger, Akka.Logger.NLog"]
suppress-json-serializer-warning = on
loglevel = "DEBUG"
log-config-on-start = on
actor {
provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
debug {
receive = on
autoreceive = on
lifecycle = on
event-stream = on
unhandled = on
}
}
remote {
log-remote-lifecycle-events = DEBUG
log-received-messages = on
helios.tcp {
transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"
transport-protocol = tcp
applied-adapters = []
port = 9000
hostname = "0.0.0.0"
public-hostname = "192.168.0.251" // This is different for different hosts, of course
}
}
}
公共主机名是公开可用的IP地址。
因此,以下是情况:
- 在运行Windows / Windows时,两个实例都可以看到对方(我给他们远程地址 - 他们输出“已解析”) - 当运行Windows / Linux,并将Linux actor的地址提供给Windows actor时,它输出“已解析”。因此,Windows可以毫无问题地连接到Linux。之后,将Windows actor的地址提供给Linux actor也会输出“已解析” - 我想,连接已经建立,没有真正的握手传递。 - 但是,在运行Windiws / Linux并将Windows actor的地址提供给Linux actor时,它会显示“失败”。没有关于任何错误或丢包的消息。日志的末尾如下所示:
``` Akka.Remote.Transport.AkkaProtocolManager|now supervising akka://TestSystem/system/transports/akkaprotocolmanager.tcp.0/akkaProtocol-tcp%3A%2F%2FTestSystem%40%5B%3A%3Affff%3A192.168.0.252%5D%3A36983-1|||| 13:20:08.3766|DEBUGAkka.Remote.Transport.ProtocolStateActor|Started (Akka.Remote.Transport.ProtocolStateActor)|||| 13:20:08.3922|DEBUG|Akka.Remote.Transport.ProtocolStateActor|Stopped|||| ```
类似日志的问题在这里描述:Akka.net starting and stopping with no activity。原因是系统协议不兼容。这是相同的问题吗?从Akka.NET文档和发行说明中得出,它具有完全的Linux支持...
那么,在配置方面我是否遗漏了什么?有人能使此示例与Linux-> Windows连接一起工作吗?