2

인스턴트 메시징 응용 프로그램을 빌드하려고합니다. 클라이언트는 메시지를 보낼뿐만 아니라 종종 오디오를 보냅니다. 그리고 나는 클라이언트와 통신하기 위해 websocket 연결을 사용하기로 결정했습니다. 그것은 빠르며 바이너리 데이터를 보낼 수 있습니다.

주요 아이디어는 클라이언트 1 메시지를 수신하고 그것에 대해 알리는 것입니다. 클라이언트 2. 하지만 여기에 문제가 있습니다. 내 응용 프로그램은 GAE에서 실행됩니다. 그리고 CLIENT1의 소켓이 서버 1에 열립니다CLIENT2 '의 어떤 경우들 서버 2에 열립니다. 이 서버는 서로 다른 클라이언트에 대해 알지 못합니다.

나는 그것을 해결하는 방법을 하나 가지고 있지만, 나는 그것이 엿 같은 방법이라고 확신한다. 나는 서버 사이에서 어떤 종류의 통신 (예를 들어 JMS 또는 다른 웹 소켓 연결을 서버 사이에서 열지 만 현재는 문제가되지 않는다)을 사용할 것이다.
하지만 반드시 재앙으로 이어질 것입니다. 나는 그 서버들이 얼마나 자주 서로 이야기 할 지 상상조차 할 수 없다. 각 메시지 SERVER1 들어는은 CLIENT2 알려야 서버 2, 서버 2에게 통지한다. 그러나 상황이 더욱 악화 될 때 서버 N이 등장합니다.

이 방법이 작동하는 또 다른 방법은 Firebase입니다. 그러나 메시지 크기를 4KB로 제한합니다. 그래서 나는 그것을 통해 오디오를 보낼 수 없다. 솔루션으로 고객에게 새로운 오디오에 대해 알릴 수 있으며,이를 위해 내 서버로갑니다.

희망 사항을 명확하게 설명했습니다. 누구든지 그것을 해결하는 방법을 알고 있습니까? 또는 그런 앱을 만드는 또 다른 방법이 있을까요?
분산 시스템의 클라이언트 간 websocket 통신

+0

질문 다소 넓습니다. 각 부분에는 자체 솔루션이 있습니다.예를 들어 오디오의 경우 오디오 데이터 자체가 아닌 저장된 오디오의 ID를 보냅니다. –

+0

예, 저는 그렇게 생각하고 있습니다,하지만 여전히. 주요 문제는 어떻게 든 다른 서버에게 client1의 client2에 대한 메시지를 알리는 것입니다. –

+0

죄송합니다. 내 의견이 잘림. 서블릿이 상태 비 저장 인 경우 문제가되지 않습니다. 모든 것을 데이터 저장소 (캐싱 포함)에 저장하면 메시지에는 데이터 저장소에서 데이터를 식별하는 데 필요한 모든 데이터가 포함됩니다. 또한 firebase를 고려하십시오. –

답변

1

메시징 클러스터를 구축하고 통신 클라이언트가 서버의 다른 인스턴스에 연결하도록하려면 서버 - 서버 통신이 불가피합니다. 보통 문제는 아닙니다.

  • 먼저로드 균형 조정을 사용하지 않으면 클라이언트가 동일한 서버에 평균 50 %의 시간 (두 서버의 경우)으로 연결됩니다.
  • 둘째, 알려진 모든 공용 클라우드에서 데이터 센터 내 링크가 빠르고 자유 롭습니다.
  • 셋째, 프론트 엔드에서 똑같은 작업을 수행하여 두 서버가 동일한 서버에 연결될 수 있는지 확인하는 것이 좋습니다. 예를 들어 DNS로드 균형 조정을 사용하여 동일한 국가의 모든 클라이언트를 동일한 서버로 연결합니다.

질문의 두 번째 부분은 대형 미디어 파일을 전달하는 것입니다. 서버에서 대역 외로 보내고 참조 만 전달하는 것이 가장 좋은 방법입니다. 댓글에서 제안 된 누군가와 마찬가지로 서버에 오디오를 저장하고 "오디오를 사용할 수 있으며 여기에서 가져 오기 ..."와 같은 메시지를 보내십시오. 이를 위해 서버를 폴링 할 필요가 없습니다. 수신 클라이언트가 요청할 때 한 번만 가져옵니다.

일반적으로 휠을 재발 명하려는 것 같습니다. 선반에서 뭔가를 사용하십시오.