2011-12-20 1 views
0

Node.js v0.6.0 이상 (RedisStore 포함)에서 제공하는 네이티브 클러스터 기능을 사용하여 Socket.io 멀티 스레드를 실행하고 있습니다.클러스터가있는 Socket.io : 열려있는 모든 연결을 반복합니다.

상태가 변경 될 때마다 서버는 각 연결을 반복하고 적절한 경우 메시지를 보냅니다. 참고 : 모든 연결에 "브로드 캐스팅"하지 않습니다. 클라이언트가 연결시 보낸 데이터와 서버 데이터를 비교하여 해당 클라이언트에 서버 데이터를 보낼지 여부를 결정합니다. 이 코드 샘플을 고려하십시오. 8 노드 실행중인 프로세스가있는 경우

io.sockets.clients().forEach(function (socket) { 
    socket.get('subscription', function (err, message) { 
    if(message.someProperty === someServerData) { 
    socket.emit('position', someServerData); 
    } 
}); 

이 하나 개의 프로세스 만했지만, 지금은, 클라이언트가 각 노드 공정 (대한 메시지를 수신 할 때 이것은 좋은 일을 즉, 모든 클라이언트가 메시지를 수신 8 번).

왜 문제가 발생했는지 이해하지만 수정이 확실하지 않습니다. 한 프로세스에서 클라이언트에 대해서만 일대일 관계를 할당하려면 어떻게해야합니까? 클러스터의 NODE_WORKER_ID을 사용하는 것이 아마도 뭔가요?

This previous 그럼 내가 도움이 될지 모르겠지만 질문은 다소 관련이있는 것 같습니다.

꽤 일반적인 요청 인 것 같습니다. 확실하게, 나는 무엇인가 놓치고있을 것임에 틀림 없는가?

+0

? 어떻게 든 사용자를 인증하거나 무엇을? – alessioalex

+0

@alessioalex 서버는 비행 위치의 긴 흐름을 읽고 그 비행을 구독하는 클라이언트에게 위치 업데이트를 보냅니다 (예 : 클라이언트가 AWE150을 구독하고 AWE150과 관련된 모든 새로운 위치를 수신함). 따라서 모든 새 위치에 대해 노드 서버는 열려있는 모든 연결을 반복하고 해당 위치로 해당 연결을 전달합니다. 아마도 내 접근 방식이 잘못되었을거야? –

+0

@David Chouinard 왜 방을 사용하지 않니? 클라이언트 x는 'AWE150' 방에 합류하고 그 데이터는'io.sockets.to ('AWE150 ')입니다. emit ('position ', somedata)' – 3rdEden

답변

1

이렇게하면 서버에서 사용자 지정 이벤트를 방출해야합니다. 당신은 예를 들어, 사용자 정의 EventEmitter를 만들고 그 터에 이벤트를 트리거하여 해당 작업을 수행 할 수 있습니다

var io = require('socket.io').listen(80); 
    events = require('events'), 
    customEventEmitter = new events.EventEmitter(); 


io.sockets.on('connection', function (socket) { 
    // here you handle what happens on the 'positionUpdate' event 
    // which will be triggered by the server later on 
    eventEmitter.on('positionUpdate', function (data) { 
    // here you have a function that checks if a condition between 
    // the socket connected and your data set as a param is met 
    if (condition(data,socket)) { 
     // send a message to each connected socket 
     // if the condition is met 
     socket.emit('the new position is...'); 
    } 
    }); 
}); 

// sometime in the future the server will emit one or more positionUpdate events 
customEventEmitter.emit('positionUpdate', data); 

또 다른 해결책은, 그 사용자는 'AWE150'을 가입해야하는 것 때문에 그들 만이 'AWE150 업데이트를 받게됩니다 '그래서 같은 :

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    if (client_is_interested_in_AWE) { socket.join('AWE150'); } 
    io.sockets.in('AWE150').emit('new position here'); 
}); 

자료 :

http://spiritconsulting.com.ar/fedex/2010/11/events-with-jquery-nodejs-and-socket-io/

정확하게 당신이 여기서 뭘하려고 무엇
+0

예! 이것은 많은 의미를 가지며 클러스터와 잘 작동합니다. 고마워, 매우 감사드립니다. –

+0

문제 없습니다. 언제나 기꺼이 도와 드리겠습니다. – alessioalex