我实际上正在尝试创建一个将使用Server-Sent Events draft的网络应用程序。根据我的知识,SSE每个连接使用一个线程,并且由于服务器将连续将数据泵送到客户端,即使一秒钟也没有闲置,我无法将线程放回池中。
因此我尝试使用Node.JS(我直到日期才使用)来处理与服务器的连接。我已经浏览了HTML5 Rocks introduction to SSE,并且有一个代码示例将SSE与Node.JS集成在一起。
但是,我很困惑Node.JS是否会同时处理数千个客户端连接并且比Apache服务器更有效地利用服务器?任何人都可以帮助我理解Node将如何在这里采取行动吗?
很抱歉,如果我听起来有点过于模糊。我准备尽可能多的澄清!谢谢!
答案 0 :(得分: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线程可以处理所有用户。
答案 1 :(得分:3)
尝试查看有关并发连接的Understanding the node.js event loop文章。我建议创建一个使用WebSockets而不是服务器发送事件的Web应用程序,因为浏览器支持SSE的次数少于WebSockets。还有很多基于WebSocket的node.js模块,在GitHub上有源代码,可以“启发”你。
答案 2 :(得分:2)
然而,我对是否感到困惑 Node.JS将处理数千个 客户端连接并发和 更有效地利用服务器 比Apache服务器?谁能帮忙 我理解Node究竟会如何 在这里行动?
我认为您应该阅读Understanding event loops and writing great code for Node.js以更好地掌握事件循环。在node.js中没有任何阻塞可以节省大量的CPU周期。
同样TJ's ebook可以帮助您掌握事件。当某些事情发生时,将调用与该事件相关的回调。
答案 3 :(得分: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"});
});