Javascript计时器& Ajax轮询/调度

时间:2009-09-16 22:34:18

标签: javascript ajax timer

我一直在寻找一种比Comet或Long-Polling更简单的方法来将一些非常基本的ajax更新推送到浏览器。

在我的研究中,我发现人们确实使用Javascript计时器以设定的间隔发送Ajax调用。这是一个糟糕的方法吗?这似乎太容易了。还要考虑我要发送的更新不是关键数据,但它们将监视可能运行几个小时的进程。

作为示例 - 使用此设计每隔10秒发送一次ajax呼叫3小时是否可靠?

谢谢,Brian

2 个答案:

答案 0 :(得分:3)

通常,使用定时器通过Ajax更新页面上的内容至少与依赖像Comet这样的长期流连接一样强大。防火墙,简短的DHCP租约等都可以中断持久连接,但轮询将在每个请求上重新建立客户端连接。

权衡是轮询通常需要服务器上有更多资源。即使少数客户每10秒轮询一次更新,也会比普通的交互式用户在服务器上承受更多负载,这些用户更有可能每隔几分钟加载一次新页面,并且在移动到另一个站点之前花费更少的时间。作为一个数据点,我去年写的一个简单的Sinatra / Ajax玩具应用程序每天有3-5个唯一访问者访问普通的“文本”页面,但它的Ajax回调URL很快成为服务器上任何站点中请求最多的部分,包括几个具有一个数量级(或更多)流量的网站。

最小化轮询引起的负载的一种方法是将Ajax回调服务器代码与通用站点代码分开(如果可能的话),并在自己的应用程序服务器进程中运行它。 “服务中间件”服务可以处理轮询回调,而不是放弃服务器线程/ Apache侦听器/等。对于什么实际上有问题“我们还在那里吗?”

当然,如果您只希望一次使用轮询服务的用户数量较少(例如,10岁以下),请继续并在同一服务器进程中开始运行。

答案 1 :(得分:0)

我认为这里可能有用的一件事是,以不变的间隔进行轮询很简单,但往往是不必要的或不受欢迎的。

我最近一直在尝试的一种方法是对民意调查给​​出积极和消极的反馈。本质上,更新是活动的(发生更改)或被动的(没有可用的更新更新,因此不需要更新)。被动更新会增加轮询间隔。激活的更新将轮询间隔设置回基线值。

例如,在我正在进行的聊天中,不同的用户发布消息。轮询间隔从5秒的高值开始。如果其他网站用户正在聊天,则会每5秒更新一次。如果活动速度变慢,并且自从显示最新消息后没有人正在聊天,则轮询间隔每次变慢和减慢大约一秒,最终每3分钟一次。如果一小时之后,有人再次发送聊天消息,则轮询间隔会突然缩短回5秒更新并开始减速。

高活动度 - >频繁的民意调查。低活动 - >最终非常罕见的民意调查。