2012-12-22 8 views
0

NodeJS는 클라이언트가 HttpLongPolling 및 WebSocket을 통해 대화방에 가입하는 다중 대화방 애플리케이션을 지원할 수 있습니까? 대화방 솔루션에 관해 생각할 때 diff에서 메시지를받을 때 긴 폴링 요청과 소켓 연결로 브로드 캐스팅하는 동안 동기화 블록이 필요하다는 것을 알 수 있습니다. 주파수. AFAIK JS에는 멀티 스레딩 및 싱크 블록 개념이 없지만 JS의 전역 변수에 액세스하려면 여전히 동기화 블록이 필요합니다. 내 문제는 대화방 솔루션을 개발하는 것이 아니라 비슷합니다. 즉, 채널을 구독하는 다른 사용자에게 적시에 메시지를 보내는 것입니다. 노드 젝은 올바른 선택입니까?Node.Js의 전역 변수 액세스를 동기화하는 방법 nodejs는 대화방 애플리케이션 개발에 적합한 선택입니까?

필자는 CometD를 분석했으며 시스템에서 채널 개념으로 구축 된 솔루션과 함께 제공되는이 솔루션에 적합한 것으로 보입니다. 하지만 CometD는 확장 성 문제가 있으므로 Nodejs에서이 솔루션을 개발할 필요가 있지만 가볍게 느껴지는 nodejs를 시도하고 있습니다. 메시지를 처리 ​​할 필요는 없지만 브라우저 클라이언트에 전달하기 만하면됩니다.

의견이 있으십니까?

+0

어쩌면 https://github.com/learnboost/socket.io/ 당신이 찾고있는 기능의 자세한 설명은 Socket.IO 사이트를 참조하십시오 그 위에 구축되는 것 –

+0

CometD에는 확장 성 문제가 있습니까? 아마도이 벤치 마크를 놓친 것 같습니다 : http://webtide.intalio.com/2011/09/cometd-2-4-0-webocket-benchmarks/. 귀하의 전화 번호가 CometD에 표시된 전화 번호보다 큰지 알고 싶습니다. – sbordet

+0

예 CometD에 대한 내 견해는 동일한 벤치 마크를 기반으로합니다. CometD의 웹 소켓 벤치 마크에 만족하지만 httpLongPolling은 httpLongPoll에서 더 많은 사용자를 기다리고 있으므로 문제가되는 것 같습니다. 150 만 CCUs의 HTTPLongPolling과 WebSocket의 조합을 지원하는 솔루션 CometD 50K 사용자의 커브는 대기 시간이 기하 급수적으로 늘어남에 따라 크게 나빠질 것 같습니다. 여러 인스턴스에 대한로드 분산은 인스턴스 당 약 50,000 명의 사용자가 30 개의 인스턴스를 필요로합니다. –

답변

1

정적 파일, longpolling (혜성), 소켓, 여러 언어 (c, PHP, 노드)의 웹 소켓을 사용하여 여러 개의 다중 사용자/다중 룸 응용 프로그램을 작성했으며 현재 NodejS + Socket.IO에서 최상의 환경을 경험했습니다.

Socket.IO가 longpolling에서 websocket 또는 flashsocket에 이르기까지 사용 가능한 클라이언트 제한에 적응하기 때문에 쉽습니다. 그럼에도 불구하고 longpolling에 의존하지 않는 것이 좋습니다.

Socket.IO 서버를 만들고 구성하고 2 개의 이벤트를 입력하고 퇴장시킵니다 (관리하려는 나머지 이벤트 옆에 있음). 응용 프로그램의 빠른 해골이 될 것입니다. 사용자 목록, 사용자 이름 등을 제어해야하지만 socket.id로 사용자 데이터를 인덱싱하고 연결/연결 끊김 이벤트로 해시를 관리하는 작업은 쉽게 수행 할 수 있습니다. "fn"은 클라이언트 콜백 함수입니다.

var http  = require('http') 
    , ioo  = require('socket.io') 
    ; 

var app = http.createServer(); 
var io = ioo.listen(app); 

// ... Place here Socket.IO configuration... 

var port = 8080; 
app.listen(port, function() { console.log('Server started'); }); 

io.sockets.on('connection', function(socket) { 
    // Management messages 
    socket.on('connect', function(name, fn) { connect(socket, name, fn); }); 
    socket.on('disconnect', function() { disconnect(socket.id); }); 

    socket.on('joinRoom', function(roomName, fn) { joinRoom(socket, roomName, fn); }); 
    socket.on('leaveRoom', function(roomName, fn) { leaveRoom(socket, roomName, fn); }); 
}); 


... 


function joinRoom(socket, roomName, fn) { 
    socket.join(roomName); 
    socket.broadcast.to(roomName).emit('serverMessage', 'a user enters'); 
    socket.emit('message', 'You enter in room ' + roomName); 
} 

function leaveRoom(socket, roomName, fn) { 
    socket.leave(roomName); 
    socket.broadcast.to(roomName).emit('serverMessage', 'a user leaves'); 
    socket.emit('message', 'You leave room ' + roomName); 
} 

또한 도서관이, Socket.IO rooms