2016-08-12 107 views
4

我有一個分佈式系統的演員,一些在Windows上,一些在Linux機器上。有時候一個演員可能需要連接其他演員並進行一些溝通。當然,有些情況下,其中一個在Windows上,另一個在Linux系統上。Linux和Windows之間的Akka.NET遠程

參與者通過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的,並給windows演員的linux演員的地址,它輸出「已解決」。所以Windows連接linux沒有問題。之後給windows的演員的地址給linux的演員也給了「已解決」 - 我想,連接已經建立,並且沒有真正的握手通過
  • 但是當運行Windiws/Linux並且給windows演員的地址給linux演員時, 「失敗」。沒有關於任何錯誤或丟棄包的消息。在日誌的末尾有以下幾點:

Akka.Remote.Transport.AkkaProtocolManager |現在監督阿卡://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 |停止||||

問題類似日誌這裏描述:Akka.net starting and stopping with no activity 究其原因,該系統的協議不兼容。這是同一個問題嗎?正如我從Akka.NET文檔和發行說明中得到的,它具有完整的Linux支持...

所以,我在配置中丟失了什麼?任何人都可以使這個示例與Linux - > Windows連接一起工作嗎?

回答

1

這裏的問題似乎是由於某種原因,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-

所以我覺得這裏發生了什麼是外出地址赫利俄斯應該從解析在Linux中是越來越搞砸了,所以它會嘗試連接到一個惡意形成的地址與Windows偵聽的不一樣。我懷疑在actor選擇URI解析代碼中特定於平臺的東西是不正確的。

我在這裏提交了一個bug:https://github.com/akkadotnet/akka.net/issues/2254

相關問題