簡體   English   中英

Linux和Windows之間的Akka.NET Remote

[英]Akka.NET Remote between Linux and Windows

我有一個分布式的演員系統,一些在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時,兩個實例都看到對方(我給他們遠程地址 - 他們輸出“已解決”)
  • 當運行Windows / Linux,並將linux actor的地址提供給windows actor時,它輸出“Resolved”。 所以Windows連接linux沒有問題。 之后給windows演員的地址給linux演員也給出了“Resolved” - 我想,連接已經建立並且沒有真正的握手傳遞
  • 但是當運行Windiws / Linux並將windows actor的地址提供給linux actor時,它會給出“失敗”。 沒有關於任何錯誤或丟棄包的消息。 在日志的末尾有以下內容:

Akka.Remote.Transport.AkkaProtocolManager |現在監督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 |已啟動(Akka.Remote.Transport.ProtocolStateActor)|||| 13:20:08.3922 | DEBUG | Akka.Remote.Transport.ProtocolStateActor |停止||||

此處描述了類似日志的問題: Akka.net啟動和停止沒有活動原因是系統協議不兼容。 這是同一個問題嗎? 當我從Akka.NET文檔和發行說明中獲得它時,它具有完整的Linux支持...

那么,我在配置中遺漏了什么嗎? 任何人都可以使用Linux - > Windows連接嗎?

這里的問題似乎是由於某種原因,Mono在其綁定地址中使用映射到IPV4的IPV6地址。

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

如果您解碼此轉換為的URL

akkaProtocol-TCP:// @ TestSystem [:: FFFF:192.168.0.252]:36983-

所以我認為這里發生的事情是Helios應該解析的出站地址在Linux端被搞砸了,所以它試圖連接到一個與Windows監聽的地址不同的錯誤地址。 我懷疑,在actor選擇URI解析代碼中特定於平台的東西是不正確的。

我在這里提交了一個錯誤: https//github.com/akkadotnet/akka.net/issues/2254

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM