>
PHPChina资讯:如果你在Google中搜索“AJAX Web 2.0”,你可以得到上亿条搜索结果,但是你能从中发现有什么技术能真正实现今天的Web 2.0所承诺的东西吗?虽然Web 2.0至今还没有一个统一的定义,不过它的核心一定是作为社会化网络平台的互联网,在这个平台上具有相同爱好的群体可以创建和分享信息。富互联网应用 (RIA)体现了部分Web 2.0概念,它提供了一个更加高效的用户界面,从而完善了Web 2.0平台;而AJAX之于Web 2.0之处则在于,它提供了一个开发RIA应用的轻量级方法,即RIA应用可通过Web浏览器这个单一的界面来执行。
如果研究一下像维基百科和博客等现有社会化网络平台的交互模式,你会发现它们都缺乏真实生活中人们交互的即时性的特点。因此可以把它们称之为准同步Web模式产品,当我们考虑Web 2.0规范的下一代平台时,需要克服这个缺点。基于互联网的聊天应用是最接近Web 2.0所需的即时交互特点的最简单例子,但是对于AJAX技术来说,即便是以一个可扩展、轻量级、基于浏览器的机制来实现这些基本的功能,也是其能力范围之外的事情。事实上,如果你仔细查看上面所说的上亿条搜索结果,你会发现只有一些开源技术能够解决通过标准浏览器机制异步推送内容给用户的难题。后面我们将粗略介绍一下这些技术,不过让我们先从最基本的东西开始介绍。
基于Web的推送技术基本原理
在将异步数据推送给浏览器方面,业内一直没有一个标准的机制或名称。在AJAX领域,该技术有不同的叫法,包括AJAX Push、Comet和Reverse Ajax,但是无论叫它什么,这些不同的实现方法具有一个共同的特点。在浏览器中唯一的轻量级通信机制就是HTTP协议,但是它仅仅能够帮助我们实现由浏览器发起的到服务器的通信的请求/响应的标准化。要想实现异步响应,有必要通过在服务器端保持一个开放的请求,当有更新的时候完成这个请求,实现对 HTTP协议的翻转。通过下图,我们可以了解标准的AJAX请求过程和通过翻转机制来推送数据之间的不同。
为了支持异步推送,我们需要一直保持一个浏览器连接开放,来等待服务器端事件来触发浏览器中的外观变化。直觉告诉我们,这种实现方式存在问题,因为我们在浏览器和服务器端都面临着有关连接的问题。
浏览器连接限制
异步Web技术面临的主要困难之一典型的浏览器“双连接限制”问题。为降低服务器负载,HTTP规范建议,用户与每个服务器最多同时建立两个连接,但是异步技术已经占用了其中一个连接作为通知通道使用。那么考虑一下这种情况,多个浏览器窗口打开了同一个Web页面,如果每一个窗口试图建立它自己的连接,我们迅速会消耗完可用连接。为了在这个限制下实现我们的目的,必须共享使用其中一个连接,但是出于安全原因,不同浏览器窗口的脚本环境是独立分开的,这使得共同使用一个共享连接实现起来非常困难。另一个可以使用的技术是利用共享的HTTP cookie,通过它来实现与指定服务器的所有HTTP交互。该cookie被所有窗口所共享,通过JavaScript操作,还可用于跨窗口通信。
但是,这个问题在portal页面环境下再次被放大,因为传统的portal引擎都不支持必需的异步通信方式。为了可以在多个portlet中使用推送技术,不仅仅需要共享浏览器连接,还需要一个专门的共享服务器连接来聚合异步响应。如果portlet是通过多个WARs进行部署的,情况可能会更复杂一些,共享机制必须在多个Web应用之间协同工作,而且将需要一些IPC机制来实现。
在我们评价不同的推送机制的时候,理解它们如何解决共享连接的问题是非常重要的,因为这个问题比较复杂,而且超出了一般应用程序开发者所能接触的范围。另外,浏览器厂商们可能会通过允许每窗口支持两个连接,或者提供具有HTTP pipelining控制支持的XmlHttpRequest,从而允许不同的窗口共享一个专门的连接,来彻底降低连接共享的复杂性。
应用服务器的可扩展性
当我们从应用服务器角度来审视开放连接的问题时,我们发现了这个问题的多面性。我们都知道,现在的应用服务器可以高效率的处理大量的连接,但是在现有Servlet模式下,每一个连接需要执行一个线程。如果这些连接由于偶发性的服务器发起更新而变为长期存活的话,服务器的可扩展性势必受到线程池耗尽的严重威胁。