c# – Linux和Windows之间的Akka.NET Remote
我有一个分布式的演员系统,一些在
Windows上,一些在
Linux机器上.有时一个演员可能需要连接其他演员并进行一些沟通.当然,有些情况下,其中一个在Windows上,另一个在Linux系统上.
演员通过ActorSelection相互连接.问题是,当Windows演员试图与Linux通信时,一切正常.但是当Linux actor发起通信时,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 } } } public-hostname是公共可用的ip地址. 所以,以下是案例: >运行Windows / Windows时,两个实例都看到对方(我给他们远程地址 – 他们输出“已解决”)
此处描述了类似日志的问题:Akka.net starting and stopping with no activity 那么,我在配置中遗漏了什么吗?任何人都可以使这个样本与Linux一起工作 – > Windows连接? 解决方法
这里的问题似乎是由于某种原因,Mono在其绑定地址中使用映射到IPV4的IPV6地址.
如果您解码此转换为的URL
所以我认为这里发生的事情是Helios应该解析的出站地址在Linux端被搞砸了,所以它试图连接到一个与Windows监听的地址不同的错误地址.我怀疑,在actor选择URI解析代码中特定于平台的东西是不正确的. 我在这里提交了一个错误:https://github.com/akkadotnet/akka.net/issues/2254 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |