Comet服务器推送技术初探
最近心血来潮想学习一下服务器推送技术,众所周知现在web应用往往都是通过ajax来实时获取更新数据的,这种结构诟病比较大,但又不得不这么做,因为现在的服务器推送还不成熟,Html5的webSocket又是那么虚幻不知道哪年能普及。 下面是一段摘抄自网络的相关技术介绍,Comet是我们研究的重点内容:
1 背景
“服务器推送技术”(Server Pushing)是最近Web技术中最热门的一个流行术语。它是继“Ajax”之后又一个倍受追捧的Web技术。“服务器推送技术”最近的流行跟“Ajax”有着密切的关系。
随着Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大。Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失。
但是,在浏览器中的Ajax应用中存在一个致命的缺陷无法满足传统桌面系统的需求。那就是“服务器发起的消息传递”(Server-Initiated Message Delivery)。在很多的应用当中,服务器软件需要向客户端主动发送消息或信息。因为服务器掌握着系统的主要资源,能够最先获得系统的状态变化和事件的发生。当这些变化发生的时候,服务器需要主动的向客户端实时的发送消息。例如股票的变化。在传统的桌面系统这种需求没有任何问题,因为客户端和服务器之间通常存在着持久的连接,这个连接可以双向传递各种数据。而基于HTTP协议的Web应用却不行。
2客户端得到通知的方式
我们知道,Web的访问机制天生是设计用来pull数据的,如图1,也就是只允许Browser端主动发起请求,server是被动的响应,不允许Server向Browser发出一个connection请求,也就是说没有为server向Browser push数据提供设计实现.虽然没有直接的实现方法,却可以使用一些变通的方式完成类似的功能。2.1 传统轮询 在Web早期,这一点常使用meta刷新实现。这将自动指示浏览器在指定秒数之后重新装载页面,从而支持简陋的轮询(polling)。例如在HTML文件中加入<META HTTP-RQUIV="Refresh" CONTENT=12>,实际上就是HTTP头标告知浏览器每12秒更新一次文档。
优点:不需要服务器端的配置。
缺点:
a)糟糕的用户体验
b)对服务器的压力很大,并且造成带宽的极大浪费。
2.2 Ajax轮询 Ajax隔一段时间(通常使用JavaScript的setTimeout函数)就去服务器查询是否有改变,从而进行增量式的更新。但是间隔多长时间去查询成了问题,因为性能和即时性造成了严重的反比关系。间隔太短,连续不断的请求会冲垮服务器,间隔太长,务器上的新数据就需要越多的时间才能到达客户机。
优点:
a)不需要太多服务器端的配置。
b)降低带宽的负荷(因为服务器返回的不是完整页面)。
缺点:
a)对服务器的压力并不会有明显的减少。
b) 实时性差,有一定的延迟。
应用:这是一项非常常见的技术,例如,大多数webmail应用程序就是通过这种技术在电子邮件到达时显示电子邮件的。
2.3 Comet Comet方式通俗的说就是一种长连接机制(long lived http)。同样是由Browser端主动发起请求,但是Server端以一种似乎非常慢的响应方式给出回答。这样在这个期间内,服务器端可以使用同一个connection把要更新的数据主动发送给Browser。因此请求可能等待较长的时间,期间没有任何数据返回,但是一旦有了新的数据,它将立即被发送到客户机。Comet又有很多种实现方式,但是总的来说对Server端的负载都会有增加.虽然对于单位操作来说,每次只需要建议一次connection,但是由于connection是保持较长时间的,对于server端的资源的占用要有所增加。
优点:实时性好(消息延时小);性能好(能支持大量用户)
缺点:长期占用连接,丧失了无状态高并发的特点。
应用:股票系统、实时通讯。
Comet的维基百科:http://zh.wikipedia.org/wiki/Comet_(web技术)
长轮询是在打开一条连接以后保持,等待服务器推送来数据再关闭的方式。
·iframe流
流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。
流方式的优点是浏览器兼容好,Google公司在一些产品中使用了iframe流,如GoogleTalk。
3 Comet介绍
Comet有时也称反向Ajax或服务器端推技术(server-sidepush)。其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据。听起来简单,但是如果熟悉Web应用程序,尤其是HTTP协议,那么您就会知道,这绝不简单。实现Comet风格的Web应用程序,同时保证在浏览器和服务器上的可伸缩性,这只是在最近几年才成为可能。目前一些主流网站都有类似的原理,例如:webQQ、开心网、校内等等,它们中消息动态都是采用类似的技术,只是具体实现方式不一样。
COMET的精髓就在于用服务器与javascript来维持浏览器的长连接,同时完成服务器端事件的浏览器端响应。这样的事件广播机制是跨网络的,同时也是实时的。
采用了Comet技术的服务器在客户机做出一个请求后,和客户机建立一个永久的连接,然后服务器会根据客户机的请求不断把数据包推向客户,这个推的过程是不间断的。由服务器推向客户机的数据在客户机的浏览器上会不断产生新的内容,而且不会产生Clientpull那样的HTML文档头,从而大大减少了延迟的时间,向(服务器响应--客户机请求)同步迈进了一步。
服务器推送通常效率要比客户端拖曳效率高,因为它不必为后续数据建立新的连接。由于始终保持连接,即使没有数据传输时也是这样,因此服务器必须愿意分配这些TCP/IP端口,对于TCP/IP端口数有限的服务器这将是一个严重的问题。
客户端拖曳效率低,因为这必须每次为传送数据建立新的连接。但是它不必始终保持连接。在实际情况中,建立HTTP连接通常需要花费相当多的时间,多达一秒甚至更多。因此从性能上考虑,服务器推送对于最终用户更有吸引力,特别是对于需要经常更新信息的情况下。
服务器推送相对客户端拖曳的另一点优势是,服务器推送相对比较容易控制。例如,服务器每一次推送时都保持一个连接,但它又随时可以关闭其中的任何连接,而不需要在服务器上设置特殊的算法。而客户端拖曳在同样的情况下要麻烦许多,它每次要与服务器建立连接,服务器为了处理将客户端拖曳请求与特定的最终用户匹配等情况,需要使用相当麻烦的算法。
如上所述,在服务器推送中,多个响应中连接始终保持,使服务器可在任何时间发送更多的数据。一个明显的好处是服务器完全能够控制更新数据的时间和频率。另外,这种方法效率高,因为始终保持连接。缺点是保持连接状态会浪费服务器端的资源。服务器推送还比较容易中断。