首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux之间的Akka.NET远程

Linux之间的Akka.NET远程
EN

Stack Overflow用户
提问于 2016-08-12 12:22:48
回答 1查看 642关注 0票数 5

我有一个由参与者组成的分布式系统,有些在Windows上,有些在Linux机器上。有时,一个演员可能需要连接其他演员并进行一些交流。当然,在某些情况下,其中一种是在Windows上,另一种是在Linux系统上。

演员通过ActorSelection相互连接。问题是,当Windows参与者试图与Linux通信时,一切正常。但是当Linux参与者启动通信时,ActorSelection.ResolveOne就失败了。

我在这里做了一个小样本:

代码语言:javascript
复制
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中的配置如下:

代码语言:javascript
复制
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参与者的地址提供给windows参与者时,它会输出“解析”。所以windows可以毫无问题地连接linux。在此之后,将windows参与者的地址给linux参与者也会给出“解决”--我想,连接已经建立,并且没有真正的握手。
  • 但是,当运行Windiws/Linux并将windows参与者的地址提供给linux参与者时,它会给出“失败”。没有关于任何错误或删除包的消息。在日志的末尾有以下内容:

监督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.Remote.Transport.AkkaProtocolManager|now

类似日志的问题在这里描述:Akka.net starting and stopping with no activity,原因是系统协议不兼容。这是同一个问题吗?正如我从Akka.NET文档和发行说明中获得的,它有完全的linux支持..。

那么,我是不是在配置上遗漏了什么?有人能让这个示例与Linux连接一起工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-13 13:04:25

这里的问题似乎是,由于某种原因,Mono使用映射到绑定地址中的IPV6地址。

akka://TestSystem/system/transports/akkaprotocolmanager.tcp.0/akkaProtocol-tcp%3A%2F%2FTestSystem%40%5B%3A%3Affff%3A192.168.0.252%5D%3A36983-1

如果您解码了这个被翻译成

akkaProtocol-tcp://TestSystem@::ffff:192.168.0.252:36983-

所以我认为这里发生的是Helios应该解析的出站地址,它在Linux端被搞砸了,所以它试图连接到一个与Windows监听的地址不一样的不正常的地址。我怀疑,参与者选择URI解析代码中特定于平台的内容是不正确的。

我在这里输入了一个bug:https://github.com/akkadotnet/akka.net/issues/2254

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38917902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档