2013-04-18 2 views
2

저는 Akka Remoting을 통해 서버의 Akka 시스템과 통신하는 Android 장치에서 실행되는 Akka 시스템을 보유하고 있습니다.Akka Remoting은 단방향 연결 만 지원합니까?

안드로이드 기기는 어떤 IP 주소라도 얻을 수 있습니다. 응용 프로그램이 실행되는 동안 IP가 변경 될 수 있으며 서버에서 IP에 연결할 수 없습니다. 따라서 나는 akka.remote.netty.hostname = "0.0.0.0"akka.remote.netty.port = 8000으로 안드로이드 장치에서 Akka를 구성했습니다.

Android Akka 시스템은 서버의 액터에 대한 참조를 가져 와서 메시지를 보내고 서버의 액터는 sender() actorRef를 기록하고 메시지를 다시 보냅니다. 이것은 서버와 안드로이드 장치가 모두 동일한 무선 랜 상에 있고 인터넷을 통해 GPRS를 통해 통화 할 때 작동합니다.

이제 연결 손실에 대해 자세히 살펴보고 다시 연결합니다. 내가 집중하고있는 시나리오는 다음과 같습니다.

  • Android 기기와 서버는 모두 wlan에 있습니다.
  • Android 기기가 서버에 메시지를 전송합니다.
  • Android에서의 Akka 리모팅은 RemoteClientStarted입니다.
  • 서버에서의 Akka 리모팅은 RemoteClientStartedRemoteServerClientConnected입니다.
  • 그런 다음 Android에서 wlan을 끈 다음 몇 초 후에 다시 켜십시오. 그 사이에 서버로 전송 된 메시지가 없습니다.
  • 안드로이드에서의 Akka 리모팅은 RemoteClientShutdownRemoteClientError (ETIMEDOUT)입니다.
  • 서버에서의 Akka 리모팅은 아무런 의미가 없습니다.
  • Android가 서버에 메시지를 보냅니다.
  • 서버는 RemoteServerClientConnected을 생성하고 메시지를 수신합니다.
  • 서버는 안드로이드에 (아래 질문에 대한 를 호출) 메시지를 보내려고하고, 생산 : RemoteServerError, RemoteServerClientDisconnected, RemoteClientShutdown, RemoteServerClientClosed.
  • Android가 서버에서 메시지를받지 못합니다.
  • 서버는 다른 메시지를 보내려고하지만, 아 카스 RemoteClient는 말한다 :

이 마지막 오류는 Akka Remote가 기존 PassiveRemoteClient을 다시 사용하는 대신 새로운 ActiveRemoteClient을 생성하려고하므로 발생합니다. 나는 이것이 서버가 RemoteServerClientConnected 이벤트를 관찰하기 전에 서버가/disconnects/shutdowns/clientcloseds 오류를 관찰한다는 것을 다시금 생각할 것입니다.이제

는 질문 :

    이 시나리오에서 메시지 A를 보낼 때 서버가 안드로이드 장치에서 최종 들어오는 연결 ( PassiveRemoteClient를) 다시 어떻게 할 수
  1. ?
  2. 서버가 클라이언트에 다시 연결하지 않도록하려면 어떻게해야합니까?

버전 :

  • 안드로이드 : 15 (4.0.3)
  • Akka : 2.1
  • 자바 : 1.6 64bit를
  • 스칼라 : 2.10.1
  • 의 Netty : 3.5 .8

답변

7

실제와 다를 수 있습니다. 당신이 원했던 대답 일 수도 있지만, 여기에 (나는 Akka 기술자입니다).

Akka 리모팅은 피어 (peer)로 작동하는 시스템간에 작동하도록 설계되었습니다. 이 개발의 원동력은 버전 2.1에 등장하기 시작한 클러스터 지원을 구축하는 것이며 2.2 이후부터 공식적으로 지원되며 더 발전 될 것입니다.

  • ActorRefs 노드 위치를 주어진 기준점을 연결하는 당신이 그들을 사용하고, 따라서 각 노드 수 있어야 어디 상관없이 동일한 작동하지 의미, 위치 투명해야한다 : 이것은 몇 가지 중요한 결과를 초래 에.
  • Akka 노드 간 통신은 근본적으로 대칭입니다.
  • 대화를 수행하는 수단으로 ActorRef을 전달하면 참조를 통해 지정된 엔터티가 사용 가능한 상태를 유지해야하거나 통신이 실패 함을 의미합니다. 체류 가능이란 "참조로 가리키는 동일한 위치에 있음"을 의미합니다.

귀하의 시나리오에서 의미하는 바는 평범한 리모컨을 사용하지 않는 배우 시스템을 연결하는 것이 더 좋을 것입니다. 단, 귀하가 고생하고있는 단명한 연결을 지원하는 다른 것을 사용하는 것이 좋습니다. 예를 들어 서버를 REST 서비스로 노출 시키거나 Akka IO 레이어를 사용하여 베어 TCP (또는 심지어 UDP)를 사용할 수 있습니다. 액터에서 서버 측의 엔드 포인트를 처리하면 동일한 클라이언트가 다른 네트워크 위치에서 회신하고 응답 메시지를 버퍼링하고 로컬 프록시 액터 뒤에있는 외부 액터를 가장하는지를 인식 할 수 있습니다.이 구성표를 사용하여 (ACKing을 사용하여) 신뢰할 수없는 채널을 통해 안정적인 메시징을 제공하고 클라이언트와 대화하는 방법의 문제가있는 부분이 한 곳에서 캡슐화되기 때문에 서버 내에서 (클러스터 일 수도 있음) 모든 통신이 작동한다는 점이 장점입니다.

짧은 이야기 : 귀하의 유스 케이스는 일반 Akka 리모컨으로 지원되는 것이 아닙니다.

+0

철저한 답변과 특히 작동시키기위한 제안에 감사드립니다. 신속한 후속 조치 :'RemoteTransport'는 Akka 밑에 리모컨을 구현하는 기반으로 보인다. 서류 미비이므로 질문해야합니다. 이것이 권장 방법입니까? 다음 버전의 Akka에서 메커니즘이 크게 바뀔까요? – eirirlar

+0

RemoteTransport가 2로 변경됩니다.2 특별한 응용 프로그램이 자체 응용 프로그램을 만들 수 있다고 생각할 때 우리는 자주 발생하지 않을 것이라고 생각합니다. 배우의 메시지와 관련된 많은 가정들이 귀하의 필요에 부합하지 않을 수 있습니다. –

+0

좋아요, 그럼'RemoteTransport'에서 멀어 질 겁니다. 궁금한 점 : akka-zeromq 테스트를 마쳤습니다. 그것은 나를 위해 수용 할 수없는 zeromq-2.1에 대해 만들어졌습니다. 그래서 zeromq3의 순수 자바 포트라고 생각되는 jeromq를 테스트했습니다. 불행히도 이것은 akka-zeromq와 함께 제공되는 scala-zeromq-binding을 대체하지 못했지만, akka-zeromq 모듈을 포크하고 scaler-zeromq-binding에 대한 의존성을 대신 jeromq로 대체했습니다. , 그러나 안드로이드에 대한 테스트는 여전히 남아 있습니다. – eirirlar

관련 문제