【问题标题】:Implementing general purpose long polling实现通用长轮询
【发布时间】: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


    【解决方案1】:

    不确定这是否能回答您的问题,但我喜欢PushPin (+ explanation of concepts) 的方法。

    我喜欢这个想法(使用反向代理并与返回代码通信 + 延迟的 REST 返回请求),但我确实对实现有所保留。我可能低估了这个问题,但在我看来,所使用的技术有点矫枉过正。不确定我是否会使用它,我更喜欢更轻量级的解决方案,但我发现这个概念非常棒。

    很想听听你最终使用了什么。

    【讨论】:

      【解决方案2】:

      既然您提到了可扩展性,我必须先从理论上说一点,因为唯一实际的衡量标准是负载测试。因此,我只能提供建议。

      一般来说,一次一次的任何事情都不利于可扩展性。尤其是每次连接一次或一次请求一次,因为这会使您的应用程序的一部分与流量成正比。 Node.js 使用其单线程异步 I/O 模型移除了每个连接的线程依赖项。当然,你不能完全消除每个连接都有一些东西,比如请求和响应对象和套接字。

      我建议避免为每个 HTTP 连接打开数据库连接的任何东西。这就是连接池的用途。

      至于在上述两个选项之间进行选择,我个人会选择第二个选择,因为它可以使每个连接保持隔离。第一个选项使用连接循环,这意味着每个连接的实际执行时间。考虑到 I/O 是异步的,这可能没什么大不了的,但是如果要在每个连接迭代和每个连接只存在一个对象之间进行选择,我宁愿只拥有一个对象。那么当突然有 10,000 个连接时,我就不用担心了。

      C10K 问题似乎是一个很好的参考,尽管老实说这只是个人判断。

      http://www.kegel.com/c10k.html

      http://en.wikipedia.org/wiki/C10k_problem

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 2011-09-16
        • 2012-06-02
        • 2022-01-14
        • 2012-10-06
        • 2014-01-08
        • 2016-03-10
        相关资源
        最近更新 更多