Akka Remoting是否支持单向连接?

eir*_*lar 2 networking android client-server akka netty

我有一个在Android设备上运行的Akka系统,它通过Akka Remoting与服务器上的Akka系统通信.

Android设备可能获得任何IP地址,IP可能会在应用程序运行时发生变化,并且IP无法从服务器访问.因此,我在Android设备上使用akka.remote.netty.hostname = "0.0.0.0"和配置了Akka akka.remote.netty.port = 8000.

Android Akka系统获取对服务器上的actor的引用,向其发送消息,服务器上的Actor记录sender()actorRef并继续向其发送消息.当服务器和Android设备位于同一个wlan上,并且当他们通过互联网通过GPRS进行通话时,这种方法也适用.

现在我正在仔细研究连接丢失和重新连接.我一直关注的场景是这样的:

  • Android设备和服务器都在wlan上.
  • Android设备向服务器发送消息.
  • Akka远程安卓产生RemoteClientStarted.
  • Akka远程服务器生成RemoteClientStartedRemoteServerClientConnected.
  • 然后我在Android上关闭wlan,等待几秒钟然后再打开它.没有尝试在其间发送到服务器的消息.
  • Android上的Akka远程产生RemoteClientShutdownRemoteClientError(ETIMEDOUT)
  • 服务器上的Akka远程处理没有说什么.
  • Android向服务器发送消息.
  • 服务器生成RemoteServerClientConnected并接收消息.
  • 服务器尝试发送消息(称为对下面的问题)到Android,并产生:RemoteServerError,RemoteServerClientDisconnected,RemoteClientShutdown,RemoteServerClientClosed.
  • Android永远不会从服务器获取消息.
  • 服务器尝试发送另一条消息,但Akkas RemoteClient说:
    • [PassiveRemoteClient @ akka://xxx@0.0.0.0:8000]已关闭
    • 启动远程客户端连接到[akka://xxx@0.0.0.0:8000 | /0.0.0.0]
    • RemoteClientError @ akka://vts@0.0.0.0:8000:错误[...

最后一个错误似乎来自于Akka Remote想要创建一个新的ActiveRemoteClient而不是重用现有的PassiveRemoteClient.我想这再次来自于服务器在看到错误/断开连接/关闭/ clientcloseds之前观察RemoteServerClientConnected事件.

现在的问题是:

  1. PassiveRemoteClient在这种情况下,如何在发送消息A时让服务器重用Android设备上的最后一个传入连接()?
  2. 如何指示服务器不要尝试连接回客户端?

版本:

  • Android:15(4.0.3)
  • 阿卡:2.1
  • Java:1.6 64位
  • 斯卡拉:2.10.1
  • Netty:3.5.8

Rol*_*uhn 7

这可能不是你一直希望的答案,但在这里(我是Akka技术领导).

Akka远程处理旨在在充当同伴的系统之间工作.开发背后的驱动力是构建集群支持,该支持从2.1版开始出现,并且将从2.2开始正式支持并进一步开发.这有一些重要的后果:

  • ActorRefs 应该是位置透明的,这意味着无论您在何处使用它们,它们的工作方式都相同,因此每个节点都需要能够连接到给定引用所指向的节点.
  • Akka节点之间的通信基本上是对称的,即使您的使用可能不是.
  • 传递ActorRef作为进行对话的手段意味着通过引用指向的实体需要保持可用或通信将失败; 并且保持可用意味着"在参考所指的同一位置".

这对你的场景意味着你最好不要使用普通的远程处理耦合你的actor系统,而是使用支持你所遭受的短暂关联的其他东西.例如,您可以将服务器公开为REST服务,或者您可以使用Akka IO层使用裸TCP(甚至UDP).在处理服务器端端点的actor中,您可以识别同一客户端是否从不同的网络位置与您通信,缓冲区回复消息,伪装成本地代理actor后面的外部actor等.使用此方案,您甚至可以构建在不可靠的通道上进行可靠的消息传递(使用ACK),美妙的是在服务器(可能是集群)内,所有通信都能正常工作,因为如何与客户端通信的问题部分被封装在一个位置.

长话短说:你的用例不是普通的Akka远程启动支持的用例.