2015-01-12 3 views
0

웹 응용 프로그램에서 브라우저 상호 연결을 위해 주로 socket.io와 함께 사용되는 node.js 서버가 있습니다.고 가용성을 갖춘 Node.js 및 Socket.io

우리는 원칙적으로 두 개의 node.js 서버로 구성되는 고 가용성 솔루션을 원합니다. 하나는 기본 서버이고 다른 하나는 기본 서버가 실패 할 경우 백업입니다. 이 솔루션을 사용하면 기본 node.js 서버가 다운되거나 중단 될 때 중단없이 원활한 기능을 제공하기 위해 백업이 인계받을 수 있습니다.

socket.io는 클라이언트의 중복이나 전송 된 메시지없이 여러 서버에서 클라이언트 연결 배열을 유지 관리 할 수있는 솔루션이 있습니까?

HA 및 node.js에 대해 고려해야 할 또 다른 패러다임이 있습니까?

답변

1

가 웹 소켓 자동차를 가지고 할 수있는 방법이 없습니다 장애 조치 새로운 서버 중단없이 때 일이 현재 연결되어 있습니다. 다운 된 서버에 연결된 웹 소켓은 죽을 것입니다. 이것이 TCP 소켓이 작동하는 방법입니다.

다행히도 socket.io를 사용하면 클라이언트는 연결이 끊겼다는 것을 빨리 알게되고 (초 이내에) 클라이언트가 재빨리 다시 연결하려고합니다. 백업 서버가 들어오는 socket.io 연결을 처리하기 위해 즉시 대기 상태 인 경우 (예 : 대기 대기) 클라이언트의 관점에서 볼 때 재 연결이 원활하게 이루어집니다. 그것은 클라이언트의 관점에서 순간적으로 네트워크가 중단되는 것처럼 보일 것입니다.

그러나 서버에 백업이 있어야 할뿐만 아니라 각 연결에 대해 존재하는 상태를 복원 할 수 있어야합니다. 연결이 알림 전달을위한 파이프 일 뿐이며 stateless 인 경우 다시 연결을받는 백업 서버가 즉시 작동하므로 매우 쉽습니다.

socket.io 연결이 서버 측에서 상태 정보를 제공하는 경우 백업 서버가 인계받을 때 해당 상태를 복원/액세스하는 방법이 필요합니다. 이 작업을 수행하는 한 가지 방법은 웹 서버와 별 개인 redis 서버에 상태를 유지하는 것입니다 (그래도 redis 서버에 대한 백업/고 가용성 계획이 필요함).

+0

그건 내가 생각한거야. 기본 서버가 다운되고 일부 클라이언트가 백업에 연결 한 다음 주 서버를 다시 온라인 상태로 전환하고 일부 클라이언트가 기본 서버로 다시 연결되는 상황이 있습니까? 그렇다면 동일한 서버에 모두 있는지 확인하는 방법이 있습니까? – tannerwj

+1

@Tanner - 동일한 IP 주소를 제공 할 수있는 여러 서버가있는 경우 들어오는 연결이 어느 서버로 연결되는지는 네트워크 인프라에 따라 결정됩니다. 이를 제어하는 ​​방법은 여러 가지가 있습니다 (로드 밸런서, 프록시, DNS 장애 조치 등). 이 문제는 일반적으로 서버 수준이 아니라 네트워크 수준에서 처리됩니다. – jfriend00

0

주 서버와 백업 서버의 SocketIO를 Redis 서버에 연결할 수 있습니다. 이렇게하면 주 서버에서 세션이 유지되고 백업 서버에서 사용할 수 있습니다. 클라이언트는 새 서버에 다시 연결해야합니다 (주 서버가 실패 할 때).

SoketIO- Redis

HA - 프록시 Node.js를 여러 인스턴스 사이의로드 밸런싱을 위해 사용된다. HA 프록시의 사용은 주 서버의 실패를 어떻게 처리 할 것인가에 달려 있습니다. 주 서버를 자동으로 전환하는 방법이있는 경우 HA 프록시는별로 유용하지 않으며 주 서버에 연결할 수없는 경우 백업 서버로 요청을 전달하도록 HA-Proxy를 구성 할 수 있습니다. HA-프록시와 유사한

다른 옵션은 다음과 같습니다

node-http-proxy

Nginx