다른 프론트 엔드 서버에 연결될 수있는 다른 클라이언트와 다시 공유해야하는 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의 두 번째 업데이트 : 두 명의 사용자가 보낸 메시지가 다른 순서로 반환 될 수 있습니다. 대기 시간이 매우 낮고 메시지가 서로 매우 가깝게 전송되는 경우에만 허용됩니다. 초 간격으로 메시지가 발생했다면 대기 시간과 규모에 문제가 있다고 말할 수 있습니다.
역사를 표시해야 할 수도 있지만 문제의 범위를 벗어났다는 이유로 느낀 점은 남겨 둡니다.
메시지 사용 여부에 관계없이 오버 헤드가 75 %라고 말합니다. 그렇다면 왜 그런 낙천적 인 구독을 사용합니까? 엄격하게 사용하지 않아야합니다. 어떻게 구독하기로 결정 했습니까? – user568109
대화방이 혼잡 할 경우 같은 대화방에있는 두 명의 사용자가 서로 다른 순서로 두 개의 메시지를 보는 것이 맞습니까? – itaifrenkel
사용자가 대화방에 로그인 할 때 사용자가 로그인하기 전에 기록 메시지를 제공하면 어떤 이점도 있습니다. – itaifrenkel