2011-03-24 135 views
7

我实际上正在尝试创建一个将利用Server-Sent Events draft的web应用程序。据我所知,SSE每个连接使用一个线程,并且由于服务器将持续向客户端泵送数据,即使一秒钟也不会闲置,因此我无法将线程恢复到池中。Node.JS服务器发送的事件

因此,我试图使用Node.JS(我没有使用,直到日期)来处理连接到服务器。我已经通过了HTML5 Rocks introduction to SSE,并且有一个将SSE与Node.JS集成的代码示例。

但是,我很困惑Node.JS是否会同时处理数千个客户端连接,并且比Apache服务器更有效地利用服务器?任何人都可以帮我理解Node究竟会在这里扮演什么角色?

对不起,如果我听起来有点太模糊。我准备尽可能多地做出澄清!谢谢!

+0

如果你还没有,看这个介绍视频(是的,它的长,但它的好)http://www.yuiblog.com/blog/2010/05/20 /视频达尔/ – generalhenry 2011-03-24 20:03:22

+0

你知道,IE和FF是一个不走这个方法对吗? – 2011-03-25 00:28:32

+0

@generalhenry - 感谢您的链接。将检查出来。 – 0xff0000 2011-03-25 03:54:04

回答

4

PHP:

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

VS

Node.js的

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

的差异它睡眠块PHP的螺纹5秒。在这5秒钟内,服务器需要有一个专门的线程,完全没有任何问题。每个用户一个线程。

使用node.js版本setInterval不会阻塞该线程。一个node.js线程可以处理所有的用户。

+0

谢谢你把最后一句话清理干净。这就是我一直在寻找的。所以如果我要进一步优化这个处理并且说让Node.JS处理20k +并发连接,我需要做什么?也许我应该要求,作为一个单独的部分 – 0xff0000 2011-03-25 03:58:51

+0

关键是确保节点没有被计算粘在一起,一个糟糕的while循环会使作品损坏。 – generalhenry 2011-03-25 08:05:04

2

不过,我很困惑, 的Node.js是否会同时处理成千上万的 客户端连接和 更有效地利用服务器 比Apache服务器?任何人都可以帮助 我明白Node将 在这里的行为?

我想你应该读Understanding event loops and writing great code for Node.js以更好地掌握事件循环。在node.js中,没有任何东西可以阻止,这将为你节省大量的CPU周期。

另外TJ's ebook可以帮助你掌握事件。当事件发生时,与该事件相关的回调将被调用。

+0

非常感谢链接。但是,当我使用Node.JS传递服务器发送的事件时,是否需要在Node.JS中编写一些显式管道代码,或者它是否会自动执行此操作? – 0xff0000 2011-03-25 03:56:36

+0

您应该使用数据存储(redis)来存储消息。来自redis的pubsub semnantics也非常强大。我也建议你看看socket.io,它也很强大。 – Alfred 2011-03-25 22:04:12

3

尝试一下Understanding the node.js event loop文章关于并发连接。我建议创建一个Web应用程序,它利用的WebSockets而不是服务器发送的事件,因为小规模企业较少受到浏览器比WebSockets的支持。还有很多基于WebSockets的node.js模块在GitHub上有源代码可以“激发”你。

+0

这和socket.io很容易不关心浏览器支持什么传输,因为它甚至可以在ie6中模拟套接字 – generalhenry 2011-03-25 08:04:29

+0

感谢您的指针。我在考虑更多关于Server-Sent Events的内容,节省了宝贵的带宽,因为它只接受一个请求,并在此之后不断推送数据。 – 0xff0000 2011-03-25 09:04:38

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"}); 
});