2013-04-18 96 views
2

我有一個Android設備上運行的Akka系統,它通過Akka Remoting與服務器上的Akka系統進行通信。Akka Remoting是否支持單向連接?

Android設備可能會獲得任何IP地址,在應用程序運行時IP可能會更改,並且IP可能無法從服務器訪問。因此我在Android設備上配置了Akka,使用akka.remote.netty.hostname = "0.0.0.0"akka.remote.netty.port = 8000

Android Akka系統獲取對服務器上的actor的引用,向它發送消息,服務器上的Actor記錄sender()actorRef並不斷髮送消息給它。當服務器和Android設備位於相同的無線局域網上,以及他們通過互聯網通過GPRS進行通話時,這種方式就可以工作。

現在我正在仔細研究連接損耗和重新連接。我一直關注的場景是:

  • Android設備和服務器都在wlan上。
  • Android設備向服務器發送消息。
  • Android上的Akka remoting生成RemoteClientStarted
  • 服務器上的Akka遠程處理產生RemoteClientStartedRemoteServerClientConnected
  • 然後關閉Android上的wlan,等待幾秒後再打開。中間不會嘗試發送消息到服務器。在Android
  • 阿卡遠程產生RemoteClientShutdownRemoteClientError(ETIMEDOUT)
  • 服務器上遠程阿卡什麼都不說。
  • Android向服務器發送消息。
  • 服務器產生RemoteServerClientConnected並接收該消息。
  • 服務器嘗試發送消息(稱之爲一個下面的問題)到Android,併產生:RemoteServerErrorRemoteServerClientDisconnectedRemoteClientShutdownRemoteServerClientClosed
  • Android從不會從服務器獲取消息。
  • 服務器嘗試發送另一個消息,但Akkas RemoteClient說:

最後一個錯誤似乎來自於Akka Remote想創建一個新的ActiveRemoteClient而不是重新使用現有的PassiveRemoteClient。我想這也是因爲服務器在看到錯誤/斷開連接/關閉/客戶端關閉之前觀察RemoteServerClientConnected事件。

現在的問題:

  1. 在這種情況下發送報文的時候,服務器如何我可以重複使用的Android設備的最後一個進來的連接(PassiveRemoteClient)?
  2. 如何指示服務器永遠不要嘗試連接回客戶端?

版本:

  • 的Android:15(4.0.3)
  • 阿卡:2.1
  • 爪哇:1.6 64bits的
  • Scala中:2.10.1
  • Netty的:3.5 .8

回答

7

這可能不是真的只是你一直希望得到的答案,但在這裏(我是阿卡科技領先者)。

Akka遠程處理旨在用作對等系統。開發背後的驅動因素是構建集羣支持,該支持從2.1版開始出現,並將從2.2版開始正式支持並進一步開發。這有幾個重要的後果:

  • ActorRefs應是位置透明的,這意味着它們的工作方式相同無論你在哪裏使用它們,因此每個節點需要能夠連接到節點,在一個給定的參考點至。
  • Akka節點之間的通信基本上是對稱的,即使您的使用可能不是。
  • 傳遞ActorRef作爲進行對話的方式意味着通過引用指向的實體需要保持可用或通信失敗;並保持可用意味着「在參考所指的同一位置」。

這對你的場景意味着什麼,你會更好地聯繫你的演員系統,而不是使用簡單的遠程處理,而是使用其他支持短時間關聯的東西。例如,您可以將服務器作爲REST服務公開,或者您可以使用Akka IO層使用裸TCP(或甚至UDP)。在處理服務器端端點的actor中,您可以識別同一個客戶端是否從不同的網絡位置與您通信,緩存回覆消息,僞裝在本地代理角色後面的外部角色等。通過此方案,您甚至可以構建可靠的消息通過你不可靠的渠道(使用ACK),而且美麗的是,在服務器(可能是一個集羣)內,所有的通信都能正常工作,因爲如何與客戶交談的問題部分被封裝在一個地方。

長話短說:您的使用案例不是由簡單的Akka遠程支持開箱即用的。

+0

感謝您的詳細解答,特別是如何使其工作的建議。快速跟進:'RemoteTransport'似乎是在Akka下面實施自己的遠程處理的基礎。這是無證的,所以我不得不問:這是推薦的方式嗎?在即將到來的Akka版本中,機制是否會發生巨大變化? – eirirlar

+0

RemoteTransport將更改爲2。2雖然可以想象,特殊的應用程序創建它們自己,我們並不期望經常發生。有很多與演員消息相關的假設可能不符合您的需求。 –

+0

好的,我猜你會遠離'RemoteTransport'。 對於好奇:我結束了測試akka-zeromq。它是針對zeromq-2.1而構建的,這對我來說是不可接受的。所以我測試了jeromq,它應該是zeromq3的純java端口。不幸的是,這並不能代替akka-zeromq附帶的scala-zeromq-binding,但我分叉了akka-zeromq模塊,並用jeromq替換了對scala-zeromq-binding的依賴。作爲一個魅力工作,但在Android上測試仍然存在。 – eirirlar

相關問題