2014-07-09 5 views
1

최근에 Netty 서버를 사용해 채팅 서버를 개발했습니다. 나는 "io.netty.http.example.websocketx.server"예제를 다시 사용하고 채널 맵, 메시지 프로세서를 추가하여 데이터베이스에 새로운 메시지를 저장하는 등 약간 수정한다.로드 밸런싱 netty websocketserver

채널 맵 열려있는 모든 채널과 구독 한 채팅방 ID를 포함합니다. 따라서 누군가가 chatroom 123에 메시지를 게시하면 messageReceived 함수에서 메시지를 받으면 서버는 해당 chatroom에 가입 한 모든 채널에 메시지를 보냅니다.

이 방법은 단 하나의 WebSocketServer 인스턴스가있을 때 제대로 작동하지만로드를 여러 WebSocketServers에로드 균형을 조정하려면 어떻게해야합니까? WebSocketServer # 1에서 메시지를 수신하면 WebSocketServer # 2에 가입 된 모든 사용자에게 메시지를 보내도록 알리는 방법이 있습니까?

+0

을 제공 Vert.x, 그들이에 게시 된 모든 메시지의 역사를받을 요구 사항입니다 체크 아웃 가치가있을 수도 있습니다 대화방, 또는 그 지점에서 게시 된 메시지 만? – johnstlr

+0

기록을 볼 필요가 없으며 사용자는 그 시점 이후에 게시 된 새로운 메시지 만받습니다. – user3819046

답변

0

Netty는 사용자가 원하는 것을 제공하지 않습니다.

사용자는 새로운 메시지를 수신하기 만하면 분산, 비 영구적 게시/구독 시스템을 찾고 있습니다. 직접 만들 수도 있지만 두 가지 옵션이 있습니다.

  • JMS 서버를 사용하십시오. 각 서버는 지속적이지 않은 주제에 등록합니다. 이들은 다른 모든 채팅 서버에 브로드 캐스트하기 위해 주제에 메시지를 게시합니다.
  • embed Hazelcast 같은 목적으로 분산 주제 메커니즘을 사용하십시오. 여기서 이점은 별도의 JMS 서버를 실행할 필요가 없다는 것입니다. 각 채팅 서버는 클러스터의 구성원이됩니다.

어느 시나리오에서나 채팅 서버는 항상 모든 메시지를 수신하고 있습니다. 적절하게 필터링 할 수 있습니다. 필요한 경우에만 관심있는 메시지를받을 수있는 두 가지 방법이 있습니다 (JMS 선택자, 헤즐리 캐스트의 다른 항목).

또한 인 Netty와 Hazelcast 구축 및 분산 이벤트 버스 새로운 채널이 채팅방에 가입

+0

고맙습니다. 헤이젤 캐스트에 대한 연구를 할 것입니다. – user3819046

+0

안녕하세요, 올바르게 이해했는지 확실하지 않습니다. 이러한 목적으로 Hazelcast를 사용하는 방법에 대해 좀 더 자세히 설명해 주시겠습니까? 그러나 새 메시지를 Hazelcast 대기열에 저장할 수 있습니다. 이는 다른 서버의 각 websocket 연결이 헤이젤 캐스트 대기열에서 사용 가능한 새로운 메시지가 있는지 확인하기 위해 풀링을 유지해야 함을 의미합니다. – user3819046

+0

이것은 내가 직접 해본 적이 없기 때문에 조금 이론적이다. http://hazelcast.org의 주제 예제 탭을 살펴보십시오. MessageListener를 구현하고 그림과 같이 주제에 가입해야합니다. Hazelcast는 메시지가 도착하면 onMessage를 호출합니다. 가장 간단한 구현은 onMessage 구현이 연결된 각 채널에 메시지를 보내는 것입니다. 당신이 지키지 못하면 헤이즐 캐슬은 메시지를 삭제할 수 있습니다. 또한 모든 채널에 메시지를 쓰는 데 약간의 시간이 걸리는 경우 실제 메시지를 다른 스레드로 오프로드하여 헤겔 캐스트 스레드를 너무 오랫동안 차단하지 않도록 할 수 있습니다. – johnstlr

관련 문제