Ajax 推送与拉取方式的比较

  • Anil Bhatt
  • 张凯峰

2007 年 7 月 19 日

话题:JavaWeb框架JavaScript语言 & 开发

使用 Ajax 可以开发出基于浏览器的具有高用户交互性和几乎不易觉察到延迟的 web 应用。实时的动态数据比如新闻标题、证券报价和拍卖行情都需要尽快地发送给用户。然而,AJAX 仍然受限于 web 请求 / 响应架构的弱点,使得服务器不能推送实时动态的 web 数据。

Delft 科技大学的 Engin Bozdag、Ali Mesbah 和 Arie van Deursen 一起讨论了下面这些可以实现基于 web 的实时事件通知的方法:

1.HTTP 拉取方式:在这种传统的方法中,客户端以用户可定义的时间间隔去检查服务器上的最新数据。这种拉取 方式的频率要足够高才能保证很高的数据精确度,但高频率可能会导致多余的检查,从而导致较高的网络流量。而另一方面,低频率则会导致错过更新的数据。理想 地,拉取的时间间隔应该等于服务器状态改变的速度。

2.HTTP 流:这种方法由存在于不间断的 HTTP 连接响应中或某个 XMLHttpRequest 连接中的服务器数据流所组成。

3.反转 AJAX:服务流应用到 AJAX,就是所谓的反转 AJAX 或者COMET 。它使得服务器在某事件发生时可以发送消息给客户端,而不需要客户端显式的请求。目标在于达到状态变化的实时更新。COMET 使用了 HTTP/1.1 中的持续连接的特性。通过 HTTP/1.1,除非另作说明,服务器和浏览器之间的 TCP 连接会一直保持连接状态,直到其中一方发送了一条明显的“关闭连接”的消息,或者有超时以及网络错误发生。

4.长时间轮询:也就是所谓的异步轮询,这种方式是纯服务器端推送方式和客户端拉取方式的混合。它是基于BAYEUX 协议的。 这个协议遵循基于主题的发布——订阅机制。在订阅了某个频道后,客户端和服务器间的连接会保持打开状态,并保持一段事先定义好的时间。如果服务器端没有事 件发生,而发生了超时,服务器端就会请求客户端进行异步重新连接。如果有事件发生,服务器端会发送数据到客户端,然后客户端重新连接。

在他们的实验性研究中,作者们在一个利用 COMET 推送方式实现(Dojo 的 Cometd 库)的 AJAX 应用和一个纯拉取方式的应用之间,对数据一致性、服务器性能、网络性能以及数据遗失进行了比较。

他们总结说:

“... 如果我们想要高数据一致性和高网络性能,我们就应该选择推送方式。但是,推送会带来一些扩展性问题;服务器应用程序 CPU 使用率是拉取方式 的 7 倍。根据我们的结果,服务器性能会在 350-500 个用户时趋于饱和。对于更大数量的用户,负载均衡和服务器集群技术就在所难免了。

 

使用拉取方式,要想达到完整的数据一致性以及很高的网络性能是很困难的。如果拉取的时间间隔大于数据更新的时间间隔,就会发生一些数据的遗失。而如 果小于数据更新的时间间隔,网络性能就会受到影响。拉取方式只有在拉取时间间隔等同于数据更新时间间隔时,才会恰到好处。但是,为了达到那样的目标,我们 就需要提前知道准确的数据更新时间间隔。然而,数据更新的时间间隔很少是静态不变并可以预知的。这使得拉取方式只有在数据是根据某种特定模式发布的情况才 有用。”

 一些其他 Comet Ajax 服务器推送模型的实现:

  • Pushlets

    :一个开源框架,可以让服务器端 java 对象推送事件到浏览器端 javascript,java applet,或者 flash 应用程序

查看英文原文http://www.infoq.com/news/2007/07/pushvspull

JavaWeb框架JavaScript语言 & 开发