写点什么

Ajax 推送与拉取方式的比较

  • 2007-07-19
  • 本文字数:1301 字

    阅读完需:约 4 分钟

使用 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

2007-07-19 09:354235
用户头像

发布了 127 篇内容, 共 42.6 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

01 K8S之容器与容器编排系统

穿过生命散发芬芳

k8s 11月日更

文本序号添加/移除工具

入门小站

工具

架构实战营-模块2-作业

lucian

架构实战营

云栖回顾|首届阿里云云原生生态合作伙伴大会:与伙伴能力融合,加速企业数字创新

阿里巴巴云原生

阿里云 云原生 生态 交流 合作伙伴

架构班模块二作业

21°Char

事务对系统影响(一)

卢卡多多

事务 11月日更

模块二作业

hhh

「架构实战营」

降本增效利器之 Serverless

中原银行

Serverless 云原生 函数计算 中原银行

架构训练营 - 模块2作业

焦龙

架构实战营

第二模块作业

张靖

#架构实战营

架构实战营 - 模块二 - 微信朋友圈的高性能复杂度分析

dog_brother

架构实战营

架构设计第二周学习总结

周文

架构实战营 「架构实战营」

Serverless 工程实践|自建 Apache OpenWhisk 平台

阿里巴巴云原生

Apache 阿里云 开源 Serverless 云原生

区块链用在房地产交易上 会怎样?

CECBC

00后已经进入网易,下一步定位阿里,年轻人这么拼,android开发艺术探索电子

android 程序员 移动开发

【LeetCode】分糖果Java 题解

Albert

算法 LeetCode 11月日更

飞桨中国行登陆鹏城 与当地企业共话AI赋能软硬件产品创新

百度大脑

人工智能 百度

linux之Ansible快速入门

入门小站

Linux

微信朋友圈架构复杂度分析

Geek_nlp小咖

架构 微信朋友圈

为面试加油助力,90个常见的Kubernetes面试题,值得收藏学习

奔着腾讯去

Docker Kubernetes 容器 云原生 Go 语言

宣布Contour v1.13.0!!!

远鹏

golang Kubernetes cncf contour ingress-controller

坚守在技术无人区,一群无名英雄的低调与浪漫

脑极体

模块二作业

莫离

架构实战营 「架构实战营」

Java 中 List 分片的 5 种方法!

王磊

Java List

区块链技术重构文创产业 首个行业自律公约发布

CECBC

极客时间 - 架构实战营 - 模块二作业

秋夫人

架构实战营

模块二作业

panxiaochun

架构实战营

OpenVINO+TF2环境搭建

IT蜗壳-Tango

11月日更

模块二作业

忘记喝水的猫

架构训练营

飞行汽车能顺利上天吗?

脑极体

连续四年包揽第一!百度AI专利申请量、授权量再度领跑全国

百度大脑

人工智能 百度

Ajax推送与拉取方式的比较_Java_Anil Bhatt_InfoQ精选文章