2014-01-14 6 views
2

다른 프론트 엔드 서버에 연결될 수있는 다른 클라이언트와 다시 공유해야하는 websocket을 통한 입력을 허용하는 응용 프로그램을 빌드하고 있습니다.서버간에 입력을 공유하는 응용 프로그램의 수평 확장

편의상 다중 사용자 멀티 룸 채팅 응용 프로그램을 상상해보십시오. 정확한 연결로 라우팅 된 입력을 얻는 것은 문제가되지 않습니다. 이는 서버 간의 메시징과이를 통한 메시지의 대기 시간을 유지할 수있는 문제입니다.

지금 나는 각 프론트 엔드가 연결하는 브로커 프로세스를 가지고 있으며 연결에 대해 알아야 할 모든 것을 대기열에 등록합니다. 이것은 프론트 엔드에서 결코 사용하지 않을 브로커로부터 메시지를받는 것을 차단하기 위해 수행됩니다. 그러나 여전히 브로커의 각 프론트 엔드로 보내지는 메시지의 75-85 %를 얻습니다.

여행 중 메시지 유효성 검사, 구문 분석 및 기타 비즈니스 로직 작업을하고 있습니다. 여행 중에 나는 구독을 위해 로컬 배열을 반복하고 각 구독 된 연결에 메시지를 보냅니다.

예 : 11 프론트 엔드 서버에서 10 개의 메시지가 주위에있는 경우 (전체 메시지 110 개 - 로컬에서 처리되고 브로커에서 다시 전송되지 않는 메시지 10 개) * 낙천적 인 가입 수준 = 0.75 메시지가 다시 전송 됨 처리 할 각 서버에 따라서 각 서버에서 해당 시간 조각에 대해 처리되는 로컬 +75 브로커 = 85 개의 메시지가 10 개 있습니다.

이제 100 개의 msg/sec 두 개의 프런트 엔드 서버가 없지만 브로커 프로세스가 각 프론트 엔드 서버로 보낸 메시지는 추가 프론트 엔드 서버를 통해 수신되는 메시지가 폭발적으로 늘어나는 것처럼 보입니다.

브로커 프로세스는 RabbitMQ 및 PostgreSQL과 통신하는 작은 node.js 응용 프로그램입니다. 프론트 엔드 서버는 또한 node.js 응용 프로그램입니다.

볼륨이 높으면 대기 시간을 짧게 유지하기 위해 어떻게해야합니까?

사용자 의견에 대한 업데이트 : 대기열간에 겹치는 부분이 많아지면 연결이 프런트 엔드 서버에 가입하게되어 각 서버에 대해 100 %가되지는 않을 것으로 예상됩니다. 최악의 경우 모든 프론트 엔드 서버는 브로커의 모든 대기열에 가입해야하므로 브로커에서 100 %의 메시지를 다시받습니다. 낙천적으로 메시지의 약 75 %만이 실제로 특정 프론트 엔드 서버로 되돌려 보내야합니다.

itaifrenkel의 두 번째 업데이트 : 두 명의 사용자가 보낸 메시지가 다른 순서로 반환 될 수 있습니다. 대기 시간이 매우 낮고 메시지가 서로 매우 가깝게 전송되는 경우에만 허용됩니다. 초 간격으로 메시지가 발생했다면 대기 시간과 규모에 문제가 있다고 말할 수 있습니다.

역사를 표시해야 할 수도 있지만 문제의 범위를 벗어났다는 이유로 느낀 점은 남겨 둡니다.

+0

메시지 사용 여부에 관계없이 오버 헤드가 75 %라고 말합니다. 그렇다면 왜 그런 낙천적 인 구독을 사용합니까? 엄격하게 사용하지 않아야합니다. 어떻게 구독하기로 결정 했습니까? – user568109

+0

대화방이 혼잡 할 경우 같은 대화방에있는 두 명의 사용자가 서로 다른 순서로 두 개의 메시지를 보는 것이 맞습니까? – itaifrenkel

+0

사용자가 대화방에 로그인 할 때 사용자가 로그인하기 전에 기록 메시지를 제공하면 어떤 이점도 있습니다. – itaifrenkel

답변

0

메시지 큐 솔루션은 올바른 옵션처럼 들립니다. 그리고 제목에서 제안하는대로, 그것을 확장하려면 수평으로 가야합니다.

나는 RabbitMQ를 사용하지 않았으므로 세부 사항을 무시할 수는 없지만 수평 확장은 클러스터를 의미하므로 http://www.rabbitmq.com/clustering.html으로 갈 수 있습니다.

0

각 사용자가 한 번에 하나의 채팅방에만 연결한다고 가정합시다. 즉, 하나의 websocket 연결 = 하나의 대화방을 의미합니다. 그래서 추가 노드를 작성합니다.js 리버스 프록시는 각 사용자 연결을 이미 대화방 이벤트 (chatroom ID를 기반로 일관된 해싱을 사용하여 대화방 선호도)를 수신하는 "프런트 엔드"node.js 프로세스로 전달합니다. 이 라우팅 알고리즘은 네트워크 사용률을 향상시키기 위해 최선의 노력을 기울여야하며 완벽 할 필요는 없습니다.

이제 각 사용자가 하나 개 이상의 채팅 방에 할 수 있도록하자. 그런 다음 둘 이상의 "프런트 엔드"서버에 연결하고 결과를 다시 사용자에게 멀티플렉싱하려면 역방향 프록시를 향상시켜야합니다.

이 디자인은 네트워크 대기 시간의 비용으로 수평 확장 성을 제공한다.

참고 : 새로운 리버스 프록시는 이제 프런트 엔드 서버입니다,하지만 난 "프런트 엔드"를 언급 할 때 질문을 설명 내가 서버를 참조 당연히.

관련 문제