2011-10-05 6 views
0

채팅 구현 작업을하고 있습니다. 아이디어는 키가 사용자 이름이 있고 값이 사용자에 대한 메세지로서 새로운가이 기록되어 도착했을 때 ConcurrentHashMap<String, <ConcurrentLinkedQueue<Message>>>대기열을 기반으로 한 클러스터 된 채팅 구현

에 의해이지도가 표시되는 사용자

에 배달 할 메시지 큐 어디에지도가 매우 간단합니다 지도를 만들고 모든 사용자는 간단한 HTTP 풀링을 사용하여 대기열에서 메시지를 가져옵니다. 이 접근법은 잘 작동합니다.

이제 클러스터에서 유사한 기능을 구현해야합니다. 캐시 복제를 위해 jboss 캐시를 사용합니다. 현재 캐시 복제는 동기식으로 작동합니다. 이것은 다른 노드에 쓰기 전에 로컬 노드에서 캐시에 쓰기가 발생하지 않는다는 것을 의미합니다.

기본적으로 캐시 인터페이스는 put 및 get 메소드를 사용하여 map과 비슷합니다.

지금은 전체 대기열을 복제합니다. 새로운 메시지가 도착하면 내가 맵에서 큐를 가져오고, 큐에 새로운 메시지를 추가하고 모든 큐에 새로운 큐를 "재 작성"합니다.

현재 큐를 복제하기 위해 사용자가 새로운 메시지를 가져 오는 요청이있는 경우이 노드와 연관된 큐를 모든 노드에서 비워 두어 복제 된 큐에서 사용자에게 메시지를 전달하십시오.

뭔가 잘못되었을 수있는 경우가 많습니다. 예를 들어, 나는 노드 A의 큐에 메시지를 넣었고, 큐의 복제는 시작되었고 다른 노드 B의 사용자는 큐에서 메시지를 가져 와서 큐를 비 웁니다. 그리고 나중에 노드 A에서 큐를 복제하고 노드 B에서 이미 메시지를 다시 전달합니다. 사용자가 동일한 메시지를 두 번 받음

클러스터에서이 메시지 루틴을 구현하는 일반적인 방법은 무엇입니까?

답변

0

요컨대, 메시징. JMS를 기반으로 자신 만의 롤을 만들거나 Enterprise Service Bus을 사용할 수 있습니다.

관련 문제