`
empireghost
  • 浏览: 53139 次
  • 来自: ...
社区版块
存档分类
最新评论
阅读更多

Comet 简介

 

   浏览器作为 Web 应用的前台,自身的处理功能比较有限。浏览器的发展需要客户端升级软件,同时由于客户端浏览器软件的多样性,在某种意义上,也影响了浏览器新技术的推广。 在 Web 应用中,浏览器的主要工作是发送请求、解析服务器返回的信息以不同的风格显示。AJAX 是浏览器技术发展的成果,通过在浏览器端发送异步请求,提高了单用户操作的响应性。但 Web 本质上是一个多用户的系统,对任何用户来说,可以认为服务器是另外一个用户。现有 AJAX 技术的发展并不能解决在一个多用户的 Web 应用中,将更新的信息实时传送给客户端,从而用户可能在“过时”的信息下进行操作。而 AJAX 的应用又使后台数据更新更加频繁成为可能。

 

 

“服务器推”是一种很早就存在的技术,以前在实现上主要是通过客户端的套接口,或是服务器端的远程调用。因为浏览器技术的发展比较缓慢,没有为“服 务器推”的实现提供很好的支持,在纯浏览器的应用中很难有一个完善的方案去实现“服务器推”并用于商业程序。最近几年,因为 AJAX 技术的普及,以及把 IFrame 嵌在“htmlfile“的 ActiveX 组件中可以解决 IE 的加载显示问题,一些受欢迎的应用如 meebo,gmail+gtalk 在实现中使用了这些新技术;同时“服务器推”在现实应用中确实存在很多需求。因为这些原因,基于纯浏览器的“服务器推”技术开始受到较多关注,Alex Russell(Dojo Toolkit 的项目 Lead)称这种基于 HTTP 长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”。目前已经出现了一些成熟的 Comet 应用以及各种开源框架;一些 Web 服务器如 Jetty 也在为支持大量并发的长连接进行了很多改进。关于 Comet 技术最新的发展状况请参考关于 Comet 的 wiki。

下面将介绍两种 Comet 应用的实现模型。

基于 AJAX 的长轮询(long-polling)方式

图 1 所示,AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面的显示进行更新。使用 AJAX 实现“服务器推”与传统的 AJAX 应用不同之处在于:

  1. 服务器端会阻塞请求直到有数据传递或超时才返回。
  2. 客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
  3. 当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。


图 2. 基于长轮询的服务器推模型
图 2. 基于长轮询的服务器推模型

 

一 些应用及示例如 “Meebo”, “Pushlet Chat” 都采用了这种长轮询的方式。相对于“轮询”(poll),这种长轮询方式也可以称为“拉”(pull)。因为这种方案基于 AJAX,具有以下一些优点:请求异步发出;无须安装插件;IE、Mozilla FireFox 都支持 AJAX。

在 这种长轮询方式下,客户端是在 XMLHttpRequest 的 readystate 为 4(即数据传输结束)时调用回调函数,进行信息处理。当 readystate 为 4 时,数据传输结束,连接已经关闭。Mozilla Firefox 提供了对 Streaming AJAX 的支持, 即 readystate 为 3 时(数据仍在传输中),客户端可以读取数据,从而无须关闭连接,就能读取处理服务器端返回的信息。IE 在 readystate 为 3 时,不能读取服务器返回的数据,目前 IE 不支持基于 Streaming AJAX。

基于 Iframe 及 htmlfile 的流(streaming)方式

iframe 是很早就存在的一种 HTML 标记, 通过在 HTML 页面里嵌入一个隐蔵帧,然后将这个隐蔵帧的 SRC 属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。


图 3. 基于流方式的服务器推模型
图 3. 基于流方式的服务器推模型

上 节提到的 AJAX 方案是在 JavaScript 里处理 XMLHttpRequest 从服务器取回的数据,然后 Javascript 可以很方便的去控制 HTML 页面的显示。同样的思路用在 iframe 方案的客户端,iframe 服务器端并不返回直接显示在页面的数据,而是返回对客户端 Javascript 函数的调用,如“<script type="text/javascript">js_func(“data from server ”)</script> ”。服务器端将返回的数据作为客户端 JavaScript 函数的参数传递;客户端浏览器的 Javascript 引擎在收到服务器返回的 JavaScript 调用时就会去执行代码。

图 3 可以看到,每次数据传送不会关闭连接,连接只会在通信出现错误时,或是连接重建时关闭(一些防火墙常被设置为丢弃过长的连接, 服务器端可以设置一个超时时间, 超时后通知客户端重新建立连接,并关闭原来的连接)。

使 用 iframe 请求一个长连接有一个很明显的不足之处:IE、Morzilla Firefox 下端的进度栏都会显示加载没有完成,而且 IE 上方的图标会不停的转动,表示加载正在进行。Google 的天才们使用一个称为“htmlfile”的 ActiveX 解决了在 IE 中的加载显示问题,并将这种方法用到了 gmail+gtalk 产品中。Alex Russell 在 “What else is burried down in the depth's of Google's amazing JavaScript?”文章中介绍了这种方法。Zeitoun 网站提供的 comet-iframe.tar.gz,封装了一个基于 iframe 和 htmlfile 的 JavaScript comet 对象,支持 IE、Mozilla Firefox 浏览器,可以作为参考。

 

Ajax程序有两个解决该问题的基本方式:浏览器每隔几秒请求服务器来获得更改,或者服务器维持与浏览器的连接并且传递数据。 长连接技术称为Comet

 

轮询方式的主要缺点是在大量客户端时产生了大量的传输浪费。每个客户端都必须有规律的请求服务器来获得更改,这是服务器资源的一个
重担。最坏的情况是程序很少更新,例如Ajax邮件收件箱。在这种情况下,大量的客户端轮询是多余的,服务器仅仅简单的响应"没有数据"。
可以通过增加轮询间隔时间来减轻服务器负荷,但是这引入了服务器事件和客户端知晓之间的延迟。当然,一个合理的折衷方案可以
多数程序适用,并且轮询的工作方式也可以接受。

然而,对Comet策略的呼唤来自它可感知的高效。客户端不会产生轮询方式特有的传输浪费,一旦事件发生,就会被发布到客户端。
但是维持长连接也消耗了服务器资源。当servlet位置持久的请求在等候状态时,servlet独占一个线程。这样传统的servlet引擎就限制了
Comet的伸缩性,因为客户端的数量会迅速超过服务器栈可以有效处理的线程的数量。

 

 

分享到:
评论
1 楼 zx848 2010-05-19  

相关推荐

    Comet一个现代PHP框架,用于构建快速的REST API和微服务。-PHP开发

    Comet一个现代PHP框架,用于构建快速的REST API和微服务。 Comet Comet是用于构建快速REST API和微服务的现代PHP框架。 Superpower以每秒100K HTTP请求和商品云硬件上的〜0.1 ms延迟快速燃烧,真正跨平台,在Linux,...

    用于构建快速REST api和微服务的现代PHP框架——gotzmann/comet

    CometComet is a modern PHP framework for building fast REST APIs and microservices.SuperpowersBlazing fast with 100K HTTP requests per second and ~0.1 ms latency on commodity cloud hardwareReally ...

    akka-web-template:一个基于 sbt 的 scala Akka 项目,它设置了一个支持 REST 和 Comet 的 web 项目

    阿卡网页模板这是一个基于 sbt 的 scala Akka 项目,它设置了一个具有 REST 和 Comet 支持的 Web 项目。 它包括一个简单的 hello-world 风格的演示应用程序和一个 actor 引导类。 它的灵感来自 efleming969 的 。 ...

    go_restapi:Go中的RestAPI和Socket服务器

    对于实时应用,如聊天、游戏或股票交易,WebSocket提供了比传统的HTTP长轮询或 comet 更高效的方式。 Go语言中有多个WebSocket库,如gorilla/websocket,它提供了一套完整的WebSocket API。下面是一个简单的...

    Lift Cookbook

    - 通过Lift框架提供的Ajax和Comet技术增强Web应用的实时交互性。 5. 自定义请求处理 - 修改Lift的请求处理管道(request pipeline),以适应自定义需求。 6. Scala对象与数据库交互 - 将Scala类转换为关系...

    Simply_Lift.pdf

    - **使用RestHelper简化**:介绍Lift提供的`RestHelper`工具类,用于简化RESTful API的开发。 - **完整的REST示例**:一个完整的RESTful API实现示例。 - **总结**:回顾HTTP和REST的相关知识。 #### 六、布线 ...

    latortuga71:主页

    我是一名安全软件工程师,专门从事红队和蓝队工具的开发,后端Web技术(如rest API开发,操纵和清理数据)。 以及自动化的红队和蓝队活动。 我还有一个小博客,我试图写一些对社区有帮助的小东西。 下面列出了一些...

    疯狂Ajax源码 11-12 章

    4. **RESTful API设计**:讲解了如何设计和使用符合REST原则的API,以支持Ajax通信,强调资源、状态转移和统一接口的重要性。 5. **前端路由**:在单页应用(SPA)中,前端路由是关键,章节可能涉及如何使用Ajax和...

    MyDiabetes2:糖尿病的应用程序,可帮助他们计算碳水化合物和蛋白质-脂肪交换剂

    :blue_heart: 我的糖尿病 适用于糖尿病的应用程序,可帮助他们计算碳水化合物和蛋白质-脂肪交换剂。... 创建产品的预数据库(通过REST-API连接) 通过图像搜索 :comet: 下载 该演示将在星期日(14.02.2021)可用。

    高中英语单词天天记scan素材

    - 例如:“Astronomers scanned the sky for a sight of the comet.”(天文学家们仔细观察天空,试图看到彗星。) - 句型结构:“S + scanned + sth + for + sth” **例句分析** - **不及物动词**: - “That ...

    Jetty中文手册

    配置Ajax、Comet和异步Servlets 持续和异步Servlets 100 Continue和102 Processing WebSocket Servlet 异步的REST Stress Testing CometD 使用Servlets和Filters Jetty中绑定的Servlets Quality of Service Filter ...

    restbed:Corvusoft的Restbed框架为C ++ 14应用程序带来了异步RESTful功能

    Restbed框架深度支持REST(Representational State Transfer)架构风格,鼓励使用HTTP动词(GET、POST、PUT、DELETE等)来表示资源的操作。开发者可以通过定义不同的HTTP端点(endpoints)轻松地创建RESTful API,这...

Global site tag (gtag.js) - Google Analytics