2012-07-15 2 views
0

아파치/PHP 서버가 Node.js 서버로 데이터를 전송할 수있는 실시간 데이터 시스템을 구축 중입니다. 그러면 즉시 소켓을 통해 연결된 클라이언트로 데이터가 전송됩니다. io. 따라서 Apache/PHP 서버는 데이터를 포함하는 요청뿐만 아니라 Node.js에게 어느 사용자에게 데이터를 보낼지 알려주는 사용자 토큰을 만듭니다.Redis에서 Socket.io 클라이언트 가져 오기

지금 당장이 작업이 정상적으로 작동합니다. 사용자 토큰에 대한 사용자의 socket.io 연결을 연결하는 연관 배열이 있습니다. 문제는 이것을 여러 서버로 확장해야한다는 것입니다. 기본적으로 socket.io의 기본 구성에서는 노드 작업자간에 연결을 공유 할 수 없습니다.

내가 염두에두고 있던 해결책은 RedisStore 기능을 사용하는 것이었고 각 직원에게 동일한 Redis 저장소를 보도록했습니다. 나는 연구를 해왔고 큰 그룹 (방)으로 메시지를 브로드 캐스팅하기 위해 pub/sub 기능을 사용하는 방법에 대한 많은 문서가있다. 괜찮습니다.하지만 단일 클라이언트에 메시지를 보낼 수 있어야하므로 RedisStore에서 사용자의 socket.io 연결을 검색 할 방법이 필요합니다.

지금 당장 생각해 볼 수있는 유일한 방법은 사용자 토큰으로 이름 지정된 'rooms'톤을 만들고 각 방에 한 명의 사용자 만있는 것입니다. 그럼 그 방으로 방금 나올 수 있어요. 그러나, 이것은 매우 비효율적 인 것처럼 보입니다.

Redis에서 사용자의 고유 한 socket.io 연결을 검색 할 수있는 더 좋은 방법이 있습니까?

+0

더 많은 서버를 추가하면 아무 것도 변경되지 않습니다. 브라우저와 nodejs 인스턴스간에 socket.io 연결이 설정되면 해당 연결의 수명 동안 동일한 서버에 남아있게됩니다. 클러스터의 다른 서버가이 특정 연결에 대해 알아야하는 이유는 무엇입니까? –

+0

글쎄, 그게 RedisStore의 아이디어 야. Redis는 모든 서버가 저장된 모든 클라이언트에 대해 알 수 있고 통신 할 수 있습니다. – jwegner

+0

npm의 bus.io를 확인하십시오. redid 및 socket.io에 실시간 분산 응용 프로그램을 빌드하기위한 빠른 인터페이스를 제공합니다. socket.io 클라이언트 관리 문제를 해결합니다. –

답변

0

노드 서버를 실행하는 서버에 소켓이 연결되면 해당 인스턴스에 연결됩니다.

그래서 PHP 서버가 클라이언트가 연결된 노드 서버를 알 수있는 방법이 필요합니다.

redis 저장소에서 클라이언트 ID 값으로 서버의 ID를 저장할 수 있습니다. 그러면 PHP는 사용할 노드 서버를 찾고 요청합니다.

관련 문제