定期刷新或轮询

时间:2009-11-05 17:22:29

标签: javascript asp.net usability

我试图通过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);
}

这是一种可靠或稳定的方式来检查消息,因为当我查看firebug时,很多请求都会进入我的数据库吗?由于请求太多,这种方法可以使我的数据库失效吗?有没有其他方法可以做到这一点,因为当我登录到Facebook并在firebug下检查时,没有请求正在发生或正在进行但是我知道他们也在使用定期刷新...他们是如何做到的?

5 个答案:

答案 0 :(得分:3)

我用萤火虫运行开着facebook打开,我每分钟都会看到一次请求,这对我来说似乎很充实。

Comet使用的另一种方法是发出请求并保持打开状态,服务器将数据运送到客户端而不完成响应。这是一个黑客攻击,违反了HTTP的所有原则:)。但它确实有效。

答案 1 :(得分:2)

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

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

如果你想要更好的粒度而不是“在db中某处改变某些东西”,你可以通过用户名(或其他一些标识符)将其分解。然后,要更新的文件将是可能对更新感兴趣的每个用户的用户名。

因此,当脚本询问服务器是否有比时间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);
}

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

答案 2 :(得分:0)

这是非常不可靠的,并且在大多数情况下可能在服务器上过于沉重。

也许你应该看一下推送界面:http://en.wikipedia.org/wiki/Push_technology

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

根据维基百科

  

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

有关详细信息,请查看我对similar question

的其他回复