2011-03-24 4 views
7

실제로는 Server-Sent Events draft을 사용할 웹 응용 프로그램을 만들려고합니다. 내 지식에 따르면 SSE는 연결 당 하나의 스레드를 사용하며, 서버가 클라이언트에 데이터를 계속 펌핑하고 잠시 멈추지 않고도 풀에 스레드를 되돌릴 수있는 방법이 없습니다.Node.JS의 서버 보낸 이벤트

따라서 Node.JS (날짜까지 사용하지 않은)를 사용하여 서버에 대한 연결을 처리하려고합니다. 나는 HTML5 Rocks introduction to SSE을 겪었으며 Node.JS와 SSE를 통합 한 코드 샘플이 있습니다.

그러나 Node.JS가 수천 개의 클라이언트 연결을 동시에 처리 할 것인지, 이 Apache 서버보다 효율적으로 서버를 사용하는지 혼란 스럽습니다. 누구나 정확히 노드가 여기에서 어떻게 행동 할 것인지 이해할 수 있습니까?

죄송합니다. 가능한 한 많은 설명을 할 준비가되었습니다! 감사!

+0

만약 당신이없는이 소개 비디오를보고 (예 그것은 긴하지만 그것이 좋다) http://www.yuiblog.com/blog/2010/05/20/video-dahl/ – generalhenry

+0

당신은 IE와 FF가이 방법에 대한 권리가 없다는 것을 알고 있습니까? –

+0

@generalhenry - 링크를 제공해 주셔서 감사합니다. 그것을 확인합니다. – 0xff0000

답변

4

PHP :

do { 
    sendMsg($startedAt , time()); 
    sleep(5); 
} while(true); 

VS는

setInterval(function() { 
    constructSSE(res, id, (new Date()).toLocaleTimeString()); 
}, 5000); 

차이 그것을 슬립 블록 PHP 스레드 Node.js를 5 초. 이 5 초 동안 서버는 아무 것도하지 않는 전용 스레드가 있어야합니다. 사용자 당 하나의 스레드.

node.js 버전에서는 setInterval이 스레드를 차단하지 않습니다. 하나의 node.js 스레드가 모든 사용자를 처리 할 수 ​​있습니다.

+0

마지막 문장으로 문제를 해결해 주셔서 감사합니다. 그게 내가 찾고 있던거야. 따라서이 처리를 더 최적화하고 node.JS가 20k + 동시 연결을 처리한다고 말하면 어떻게해야합니까? 어쩌면 나는 별도의 섹션으로 질문해야한다. – 0xff0000

+0

키는 노드가 계산으로 움츠려 들지 않도록하고있다. 하나는 나쁜 루프가 작업을 껌칠 것이다. – generalhenry

2

그러나, 나는 Node.js를 동시에 클라이언트 연결의 수천을 처리하고 보다 효율적으로 아파치 서버가 아닌 을 서버를 사용하는지에 혼란 스러워요? 누구든지 도와 줄 수 있습니까 노드 정확히 어떻게 노드 행동 것입니다?

이벤트 루프에 대해 더 잘 이해하려면 Understanding event loops and writing great code for Node.js을 읽어야합니다. node.js에서는 아무 것도 차단하지 않으므로 많은 CPU 사이클을 절약 할 수 있습니다.

TJ's ebook도 이벤트를 파악하는 데 도움이 될 수 있습니다. 무언가가 발생하면 해당 이벤트와 관련된 콜백이 호출됩니다.

+0

링크에 대해 고마워. 그러나 Node.JS를 사용하여 Server-Sent Events를 전달할 때 Node.JS에 명시적인 파이핑 코드를 작성해야합니까, 아니면이를 자동으로 수행할까요? – 0xff0000

+0

메시지를 저장하려면 데이터 저장소 (redis)를 사용해야합니다. redis의 pubsub semnantics도 매우 강력합니다. 또한 매우 강력한 socket.io를 살펴 보도록 조언합니다. – Alfred

3

동시 연결과 관련하여 Understanding the node.js event loop 문서를 참조하십시오. SSE는 WebSocket보다 브라우저에서 덜 지원되기 때문에 Server-sent 이벤트 대신 WebSockets를 사용하는 웹 응용 프로그램을 만드는 것이 좋습니다. 또한 GitHub에 소스 코드가있는 WebSocket 기반의 node.js 모듈이 많이있어 "영감을 줄 수 있습니다."

+0

That와 socket.io는 ie6에서도 소켓을 에뮬레이션 할 수 있기 때문에 브라우저가 지원하는 전송 장치를 신경 쓰지 않아도됩니다. – generalhenry

+0

포인터를 보내 주셔서 감사합니다. 나는 단지 하나의 요청을 받아들이고 이후에 계속해서 데이터를 밀어 내기 때문에 소중한 대역폭을 절약하는 Server-Sent Events 라인에 대해 더 많은 것을 생각하고있었습니다. – 0xff0000

1

express + connect-sse 사용해보십시오 :

var sse, express, app; 

sse = require('connect-sse')(); 
express = require('express') 

app = express() 
app.get('/events', sse, function (req, res) { 
    res.json("this is an event"); 
    res.json({here: "is", another: "event"}); 
});