【发布时间】:2013-02-17 21:49:08
【问题描述】:
我一直在尝试实现一个简单的长轮询服务,以便在我自己的项目中使用,如果我成功了,可能会将其作为 SAAS 发布。到目前为止,这是我尝试过的两种方法,都使用 Node.js(在后面轮询 PostgreSQL)。
1。在相同的时间间隔内定期检查所有客户端
每个新连接都被推送到一个连接队列中,该队列在一段时间内被遍历。
var queue = [];
function acceptConnection(req, res) {
res.setTimeout(5000);
queue.push({ req: req, res: res });
}
function checkAll() {
queue.forEach(function(client) {
// respond if there is something new for the client
});
}
// this could be replaced with a timeout after all the clients are served
setInterval(checkAll, 500);
2。每隔一段时间检查每个客户端
每个客户都有自己的ticker,用于检查新数据
function acceptConnection(req, res) {
// something which periodically checks data for the client
// and responds if there is anything new
new Ticker(req, res);
}
虽然这可以降低每个客户端的最小延迟,但也会通过设置大量超时来引入开销。
结论
这两种方法都很容易解决问题,但我认为这不会轻易扩展到 1000 万个打开的连接,尤其是因为我在每次检查每个客户端时都要轮询数据库。
我考虑过在没有数据库的情况下执行此操作,并立即向所有打开的连接广播新消息,但如果客户端的连接在广播发生时中断几秒钟,这将失败,因为它不是持久的。这意味着当客户端第一次轮询时,我基本上需要能够在历史记录中查找消息。
我想这里的一个步骤是拥有一个数据源,我可以在其中订阅传入的新数据(CouchDB 更改通知?),但也许我在这里遗漏了一些大局?
进行高度可扩展的长轮询的常用方法是什么?我并没有特别局限于 Node.js,实际上我更喜欢任何其他建议并说明原因。
【问题讨论】:
标签: node.js long-polling