Glassfish与服务器推送技术
“服务器推送技术”(Server Pushing)是最近Web技术中最热门的一个流行术语,它的别名叫“Comet”(彗星)。它是继“Ajax”之后又一个倍受追捧的Web技术。“服务器推送技术”最近的流行跟“Ajax”有着密切的关系。
随着Web技术的流行,越来越多的应用从原有的C/S的模式下转变为B/S的模式,享受着Web技术所带来的各种优势(例如,跨平台,免客户端维护,跨越防火墙,扩展性好等等)。但是基于浏览器的应用,也有它不足的地方。最主要的地方在于界面的友好性和交互性。由于游览器中的页面每次需要全部刷新才能从服务器端获得最新的数据或向服务器传送数据。这样产生的延迟所带来的视觉感观非常糟糕。因此很多的桌面应用为了获得更友好的界面放弃了Web技术,或者采用浏览器的插件技术(ActiveX, Applet, Flash等等)。但是浏览器插件技术本身又有许多问题,例如跨平台问题,和插件版本兼容性问题。
随着Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大。Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失。Ajax还利用DHTML和丰富的Javascript语言可以模拟桌面系统的各种事件产生和响应过程,以及平滑滚动和拖拽的效果。还不止这些,更有一些IT巨头(Google,Sun,Oracle等)提供了非常丰富的Ajax开发工具,使得开发和调试Ajax应用变得简单高效,并且开发的Ajax应用还可以跨越各种浏览器和操作系统。在这种情况下基于Ajax的Web应用迅速涌起,吞噬着原有桌面系统的份额。聊天工具,邮件阅读器,博客编辑器,甚至是Office办公软件和文字处理软件在浏览器中都有着美丽的外观和几乎可以与桌面系统媲美的交互界面。Google更是提出“有了浏览器和Google,就不需要微软”的口号和策略。在Ajax的世界中,除了传统的CAD设计软件和大型游戏软件等等因为对系统硬件的苛刻需求,还离不开桌面系统以外,似乎其他所有的应用都可以变成Web应用了。
但是,在浏览器中的Ajax应用中存在一个致命的缺陷无法满足传统桌面系统的需求。那就是“服务器发起的消息传递”(Server-InitiatedMessageDelivery)。在很多的应用当中,服务器软件需要向客户端主动发送消息或信息。因为服务器掌握着系统的主要资源,能够最先获得系统的状态变化和事件的发生。当这些变化发生的时候,服务器需要主动的向客户端实时的发送消息。例如股票的变化。在传统的桌面系统这种需求没有任何问题,因为客户端和服务器之间通常存在着持久的连接,这个连接可以双向传递各种数据。而基于HTTP协议的Web应用却不行。上节中也提到过,在Web世界中,服务器永远是被动的发送数据,前提是客户端必须先发送请求。浏览器其实并不知道服务器的信息什么时候会有改变,为了模拟实时的交流,或者不想错过某些信息,只能通过“Polling”的技术不断刷新页面来获得最新的数据。这种方式不但浪费服务器的资源(前文提过),最重要的是每次建立(或关闭)新的HTTP连接需要一定的延迟,这种延迟使得频繁信息传递的应用无法忍受。于是就产生的“服务器推送技术”。
“服务器推送技术”在很久以前就出现过。例如Netscape曾经退出适用于Push技术的专用浏览器和经过修改的HTML语言。但是这仅仅在特定的浏览器中才能使用,其他流行的浏览器(IE等)就不兼容这种技术。
现在的“服务器推送技术”是在保持原有的HTTP协议不变,在服务器端改变处理方式,使得服务器能够使用浏览器已经打开的HTTP连接,主动向浏览器发送消息。这里关键的技术是要保持原有的HTTP连接不断。一旦拥有持久的连接,服务器就可以根据自己数据更新,随时的向客户端发送最新的信息。
在Glassfish中,Grizzly通过NIO的技术实现了异步请求服务(ARP),并在ARP之上扩展了服务器推送技术的实现,将其也命名为“Comet”。因为使用了NIO,Grizzly才可以在保持HTTP连接的同时,并不会绑定固定的线程,使得Glassfish具有很好的扩展性,可以很好的同时支持大量的Comet请求。
相关推荐
结束数据方法的参数,该如何定义?-- 集合为自定义实体类中的结合属性,有几个实体类,改变下标就行了。<input id="add" type="button" value="新增visitor&quo