2012-03-16 5 views
4

사람들이 일반적으로 SocketIO 및 Node로 빌드하는 첫 번째 앱은 일반적으로 채팅 앱입니다. 이 채팅 앱에는 기본적으로 여러 개의 클라이언트로 브로드 캐스팅 할 1 개의 노드 서버가 있습니다. 노드 코드에서, 당신은 비슷한 것을 가질 것입니다.NodeJS + SocketIO : 단일 실패 지점 조정 및 방지

//Psuedocode 
for(client in clients){ 
    if(client != messageSender){ 
    user.send(message); 
    } 
} 

소수의 사용자에게 적합하지만이 문제가 있습니다. 우선, 노드 서버 인 단일 실패 지점이 있습니다. 둘째로, 클라이언트의 수가 증가함에 따라 앱이 느려질 것입니다. 우리가 병목에 이르렀을 때 무엇을해야합니까? 이 문제를 완화하는 데 사용할 수있는 아키텍처 (수평/수직 스케일링)가 있습니까?

+0

서버에 얼마나 많은 클라이언트가 연결 되길 기대합니까? 그 루프가 눈에 띄게 느려지려면 수만 명이 아니라면 수천 명이 필요하다고 말할 수 있습니다. –

+0

수백만 명의 사용자가 있다면 잘되지 않습니까? – denniss

답변

4

채팅 앱에 내결함성이있는 노드 서버가 여러 개 필요하고 "소켓 1"을 사용하여 서버와 클라이언트 간 통신을하려면 node.js 모듈이 적합합니다 청구서. 다중 노드 서버와 같은 -

https://github.com/hookio/hook.io

그것은 여러 사이의 통신 "일을"교차하는 프레임 워크를 방출 이벤트는 기본적입니다.

대부분의 모듈과 비교하면 사용하기가 비교적 복잡합니다. 이는 해결해야 할 복잡한 문제이므로 이해할 수 있습니다.

그런데 문제가 발생하기 전에 수천 명의 동시 사용자가 있어야하고 다른 많은 문제가있을 것입니다.

당신이 할 수있는 또 다른 일은 연결을 잃어 버렸을 때 (어쨌든 항상 발생합니다), 예를 들어 어떤 식 으로든 응용 프로그램을 개발하려고하는 것입니다. 서버가 다운되거나, 클라이언트가 네트워크 문제 (예 : 모바일 사용자)를 갖는 경우 응용 프로그램이이를 처리하고 그러한 문제를 정상적으로 복구 할 수 있어야합니다.

+0

링크가 끊어졌습니다. – funerr

2

Node.js에는 단일 이벤트 루프 스레드가 있으므로이 단일 실패 지점이 해당 DNA에 기록됩니다. 코드를 변경 한 후에 서버를 다시로드하는 경우에도이 스레드를 중지해야합니다.

그런 실패를 정상적으로 처리 할 수있는 많은 도구가 있습니다. forever을 사용할 수 있습니다. 주어진 스크립트가 계속 실행되도록하는 간단한 CLI 도구. 다른 옵션으로는 distributeup이 있습니다. Distribute는 노드에 대한로드 밸런싱 미들웨어입니다. Up은 Distribute 위에 구축되어 JavaScript API 또는 명령 행 인터페이스를 사용하여 가동 중지 시간을 재로드하지 않습니다.

추가 정보 두 개 이상의 프로세스/프로세스 간의 연결 참조를 유지하기 위해 Socket.io와 함께 Redis Store를 사용해야 할 때가 있습니다. 서버. 이러한 옵션은 이미 herehere으로 광범위하게 논의되었습니다.

Redis 저장소를 사용하지 않으려는 경우 socket.io-clusterhub 옵션을 사용할 수도 있습니다.

+0

배포판을 사용해 본 적이 있습니까? 모든 사용자에게 어떻게 방송 할 수 있을지 궁금합니다. 그것은 각 노드가 연결된 모든 사용자에 대해 알아야만하는 것처럼 보입니다. – denniss