【问题标题】:Periodic refresh or polling定期刷新或轮询
【发布时间】:2009-11-05 17:22:29
【问题描述】:

我正在尝试通过 XMLHttp(XHR) 在我的网站上使用定期刷新(ajax)/轮询来检查用户是否每 10 秒在数据库上有一条新消息,然后通过创建一个通知他/她像这样动态div:

function shownotice() {
    var divnotice = document.createElement("div");
    var closelink = document.createElement("a");
    closelink.onclick = this.close;
    closelink.href = "#";
    closelink.className = "close";
    closelink.appendChild(document.createTextNode("close"));
    divnotice.appendChild(closelink);
    divnotice.className = "notifier";
    divnotice.setAttribute("align", "center");
    document.body.appendChild(divnotice);
    divnotice.style.top = document.body.scrollTop + "px";
    divnotice.style.left = document.body.scrollLeft + "px";
    divnotice.style.display = "block";
   request(divnotice);
}

这是一种可靠或稳定的方式来检查消息,因为当我查看萤火虫时,我的数据库中有很多请求?这种方法会因为请求过多而使我的数据库崩溃吗?有没有另一种方法可以做到这一点,因为当我登录到 facebook 并在 firebug 下检查时,没有请求发生或正在进行,但我知道他们也在使用定期刷新......他们是怎么做到的?

【问题讨论】:

    标签: javascript asp.net usability


    【解决方案1】:

    我在运行 firebug 的情况下打开 facebook,大约每分钟看到一次请求,这对我来说似乎很多。

    Comet 使用的另一种方法是发出请求并使其保持打开状态,服务器在不完成响应的情况下将数据分发给客户端。这是一个 hack,违反了 HTTP 的所有原则:)。但它确实有效。

    【讨论】:

      【解决方案2】:

      您可以每 10 秒检查一次新数据,但不是检查数据库,而是需要进行影响较小的检查。

      我要做的是修改数据库更新过程,以便当它对某些数据进行更改时,它还会更新文件上的时间戳以显示最近的更改。

      如果您想要比“数据库中某处发生更改”更好的粒度,您可以按用户名(或其他标识符)将其分解。然后,要更新的文件将是每个可能对更新感兴趣的用户的用户名。

      所以,当你的脚本询问服务器是否有比时间 t 更新的用户 X 的任何信息时,服务器端脚本可以将文件的时间戳与时间参数进行比较,看看是否数据库中有任何新内容。

      在更新数据库的过程中,添加(大致)执行的代码:

      foreach username interested in this update
      {
          touch the file \updates\username
      }
      

      那么你查看是否有新数据的函数如下所示:

      function NewDataForUser (string username, time t)
      {
           timestamp ts = GetLastUpdateTime("\updates\username");
           return (ts > t);
      }
      

      一旦发现有新数据,您就可以进行完整的数据库查询并获取所需的任何信息。

      【讨论】:

        【解决方案3】:

        这非常不可靠,而且在大多数情况下可能对服务器造成太大负担。

        也许你应该看看推送接口:http://en.wikipedia.org/wiki/Push_technology

        我听说 Comet 是最具可扩展性的解决方案。

        【讨论】:

          【解决方案4】:

          我怀疑 Facebook 使用 Flash 电影(他们总是下载一个名为 SoundPlayerHater.swf 的电影),他们用它来与他们的服务器进行一些通信。这不会被 Firebug 捕捉到(可能会被 Fiddler 捕捉到)。

          【讨论】:

            【解决方案5】:

            这不是更好的方法。因为即使没有真正的更新,您最终也会每 10 秒查询一次服务器。

            您可以模拟服务器推送(reverrse AJAXCOMET)方法,而不是这种轮询方法。这将完全减少服务器的工作量,如果服务器端有更新,则只更新客户端。

            根据维基百科

            反向 Ajax 指的是 Ajax 设计 使用长寿命 HTTP 的模式 连接以实现低延迟 网络服务器和网络服务器之间的通信 浏览器。基本上这是一种方式 从客户端向服务器发送数据和 一种推送服务器数据的机制 返回浏览器。

            欲了解更多信息,请查看我对similar question的其他回复

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-07-06
              • 1970-01-01
              • 1970-01-01
              • 2018-05-15
              • 2015-12-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多