Comet—“服务器推”技术 | 影の域

影の域

关注web前端,追逐html5脚步,体会code人生

Comet—“服务器推”技术

| 5,039 点击

一、名称解释:

Comet最早是由Alex Russell(Dojo Toolkit 项目主管和Dojo Foundation主席)在自己的博客中提出的术语,他是这样说的:”New services like Jot Live and Meebo are built with a style of data transmission that is neither traditional nor Ajax. Their brand of low-latency data transfer to the browser is unique, and it is becoming ever-more common. Lacking a better term, I’ve taken to calling this style of event-driven, server-push data streaming “Comet”.” “They all use long-lived HTTP connections to reduce the latency with which messages are passed to the server. In essence, they do not poll the server occasionally. Instead the server has an open line of communication with which it can push data to the client.”

Comet指的是一种Web应用程序架构。可以直接说,它不是一种技术,而是一种思想,只是这种思想采用了已有的技术去实现。在这种思想里,客户端(Client)不需要显式地向服务器端(Server)发出请求,Server会在其数据发生变化的时候主动将数据异步发送给Client,从而使Client能够及时更新数据并呈现给用户。它不同于传统的Web,也不同于当前流行的Ajax,这种思想非常架构思想非常适合event-driven(事件驱动)式的Web应用和对交互性及实时性要求很强的应用,比如股票交易,聊天室,Web IM,网游等。

二、成功案例:

三、实现方式:

Comet使用Client和Server之前的HTTP长链接最为数据传输的通道。

实现Comet,最常见的有下面两种方式:

  1. Ajax的长轮询(long-polling):Javascript在处理完服务器返回的信息后再次发出请求,重新建立连接。不同于一般的Ajax,Javascript请求Server,无数据时Server不中断请求,still loading,在一定时间内,获取到数据后,返回请求,又Javascript获取数据后再次发出请求,由此轮询。需要注意的是请求的间隔时间以及每次请求的最长Loading时间。
    优点:异步请求;无需浏览器任何插件支持;采用Ajax技术,兼容性强;
    缺点:会产生大量的通信量,只能通过增加轮询的时间间隔来减轻Server的压力;
  2. Iframe结合Htmlfile流(streaming):通过在页面上嵌入一个隐藏的Iframe,设置其src属性为一个长连接的请求,Server采用flush方式将数据作为前端Javascript函数的参数传递;
    优点:不会有很大的通信量,而且数据接收非常及时,并且无中断;
    缺点:会产生进度条的Loading状态并一直穿着,用户使用体验很不好,在Google Talk中,通过Htmlfile Active解决了IE下的进度条显示问题;保持长期链接也非常耗服务器资源;

四、临时采用方案:

目前,白社会(bai.sohu.com)采用了第一种方式来实现实时消息的推送,这种方式还存在一个问题就是,在多个tab页下,如何保证没有相同域的长连接请求(IE在同域下只能同时支持两个长链接),于是采用了子域形式来区分多个域,以保证每个tab页下访问的地址都不在一个域名下,此时问题又出来了,出现了Ajax跨域名请求,不过这个问题比较常见,解决方案也很多,我们采用的是Iframe形式;由此,为了实现Comet,我们走了很长一条路,虽然路的确走完了,但是走得很长很艰难,这也是为什么称它为“临时解决方案”,因为它并不是一个完美的方案,但我也相信,以后会更加完美。

五、现有可参考框架

  1. Cometd:官方地址:www.cometd.org
    可以参考http://www.blogjava.net/xmatthew/archive/2008/11/20/208911.html
  2. Pushlet:官方地址:www.pushlets.com
    pushlet 提供了基于 AJAX 的 JavaScript 库文件用于实现长轮询方式的”服务器推”;还提供了基于 iframe 的 JavaScript 库文件用于实现流方式的”服务器推”。
    可以参考http://www.javaeye.com/topic/89158

六、文章参考

  1. Comet:基于 HTTP 长连接的”服务器推”技术
  2. 实战 Comet 应用程序开发
  3. Comet on wikipedia

最后,本人对Comet也未进行深入的研究,只是希望通过此文能给大家起一个抛砖引玉的作用,希望大家能够在客户端实时技术上能够起点帮助作用,能够越来越丰富我们前端技术。

原文地址: http://ued.sohu.com/article/118