2014-11-19 2 views
1

액터를 사용하여 websocket을 통해 클라이언트에 메시지를 보냅니다. 따라서 연결된 각 클라이언트는 자체 액터를 얻습니다. 비즈니스 논리는 단순히 actorSystem.actorSelection(s"/user/connections/UserQueues-${userId}") ! Message(content)입니다. 특정 유형의 메시지의 경우 클라이언트가 연결되어 있지 않은 경우 메시지를 유지하고 클라이언트가 연결될 때 메시지를 다시 전달해야합니다. 전달되지 않은 메시지를 기억할 메시지를 배우에게 라우팅하는 가장 좋은 방법은 무엇입니까? 이것은 사용자가 아직 연결되어 있지 않고 "/ user/connections/UserQueues - $ {userId}"경로의 액터가 계층 구조에없는 경우에 발생합니다.액터가 akka에 생성되지 않은 경우 다른 액터에게 메시지를 전달하는 방법

답변

0

websocket 액터를 제어한다면이 메시지를받는 ACK를 만들 수 있습니다. 그리고 ACK가 없으면 몇 번이고 다시 전송할 것입니다. Akka는 akka-persistence의 AtLeastOnceDelivery에서 이것을 지원하고 있습니다. 사용 방법은 AtLeastOnceDelivery example in docs입니다.

긴 이야기를 짧게, 당신은 deliver(destination, deliveryId => Msg(deliveryId, s))-!를 사용하여 전환 한 후이 메시지가 전달되었는지 확인하는 방법을 찾을 필요 (보낸 사람에게 다시 확인을 보낸 다음 그 안에 confirmDelivery 전화).

희망이 도움이됩니다.

+0

응답 해 주셔서 감사합니다. 나는 재 전달이 나의 경우에 잘 작동한다고 생각하지 않는다. 배달되지 않은 메시지는 클라이언트가 로그인 할 때까지 며칠 동안 저장 될 수 있습니다. 클라이언트가 로그인 한 직후에 메시지를 표시해야하기 때문에 재전송 시간 제한을 너무 크게 만드는 것은 선택 사항이 아닙니다. 서버를 너무 작게 만들면 서버에 불필요한 부담이 듭니다. 사실 사용자를 나타내는 액터가 아직 인스턴스화되지 않았기 때문에 데드 레터 큐에 바인딩 된 메시지를 가로 챌 수있는 좋은 방법이 필요합니다. 전달되지 않은 메시지의 저장/검색은 간단한 작업입니다. – andruha

관련 문제