我正在编写一个Node.js服务器,客户端可以通过/read?id=45
连接到服务器(在此示例中客户端ID为45)。服务器将连接存储在对象中,当消息到达客户端#45时,它将在其上调用res.end(message)
。或者,在60秒后,连接将被关闭,并且想法是客户再次呼叫/read
。
连接存储如下:
var openConn = {};
function handleReadReq(req, res) {
var id = input.returnFromGet(req, 'id'); // fetches the ?id value
// Save the connection to openConn
openConn[id] = new Array();
openConn[id].push(res);
openConn[id].push( setTimeout(function() {
openConn[id][0].end('');
delete openConn[id];
}
}, 60 * 1000) );
}
如果我向/ bcast发送消息,它将广播到openConn中的所有连接,如下所示:
function doBcast(req, res) {
var message = input.getPost('message'); // akin to input.returnFromGet
var knownClients = 0
var stealOpenConn = openConn; // 'steal' openConn
openConn = {};
for(var client in stealOpenConn) {
clearTimeout(stealOpenConn[client][1]);
stealOpenConn[client][0].end(message);
++knownClients;
}
res.end('' + knownClients);
}
这很棒!但是,一旦我连接了几千个客户端,它就会开始变得非常慢。以这种方式到达4000个客户端平均需要16秒,这是不可接受的。
我有什么办法可以提高速度吗?
我尝试使用数组而不是对象,这没有任何区别。处理openConn
而不是通过stealOpenConn
也不会改善任何事情。