简单的异步Servlet和Comet/Bayeux协议(protocol)之间有什么区别?
我正在尝试实现一种“服务器推送”(或“反向Ajax”)类型的网页,该网页将在服务器上发生事件时从服务器接收更新。因此,即使没有客户端显式发送请求,我也需要服务器能够将响应发送到特定的客户端浏览器。
我知道,Comet是这类技术的统称。协议(protocol)以“Bayeux”为准。但是,当我查看servlet规范时,甚至“异步servlet”似乎也可以完成相同的工作。我的意思是,我可以使用
<async-supported>
在web.xml中将属性设置为true;并且该Servlet将能够异步将响应发送到客户端。然后,我可以拥有一个基于jQuery或ExtJS的ajax客户端,该客户端一直在执行
long_polling()
调用servlet。类似于以下链接中所述的内容
http://www.ibm.com/developerworks/web/library/wa-reverseajax1/index.html#long
所以我的问题是这样的:
简单的异步Servlet和Comet/Bayeux协议(protocol)之间有什么区别?
谢谢
最佳答案
的确,“Comet”是这些技术的术语,但是Bayeux协议(protocol)仅由很少的实现使用。 cometd 技术可以使用它想要的任何协议(protocol)。贝叶就是其中之一。
话虽如此,异步Servlet解决方案和Comet + Bayeux解决方案之间有两个主要区别。
第一个区别是Comet + Bayeux解决方案独立于传输Bayeux的协议(protocol)。
在CometD项目中,存在可以承载Bayeux的客户端和服务器的可插拔传输。
您可以使用HTTP来承载它,其中Bayeux是POST请求的内容,但是您也可以使用WebSocket来承载它,而Bayeux是WebSocket消息的有效负载。
如果使用异步servlet,则无法利用WebSocket,它比HTTP的way more efficient更大。
第二个区别是异步servlet仅携带HTTP,并且您需要更多来处理远程Comet客户端。
例如,您可能想要唯一地标识客户端,以便同一页面的2个选项卡将导致2个不同的客户端。为此,您需要在异步servlet请求中添加一个“属性”,我们将其称为sessionId
。
接下来,您希望能够对客户端进行身份验证;只有经过身份验证的客户端才能获得sessionId
。但是要区分第一个认证请求和其他后续已认证请求,您需要另一个属性,例如messageType
。
接下来,您希望能够迅速通知由于网络丢失或其他连接问题而导致的断开连接;因此,您需要提出一种心跳解决方案,这样,如果心跳跳动,您就知道连接是活着的;如果没有跳动,您就知道连接已经死了,请执行救援操作。
接下来,您需要断开连接功能。等等。
很快,您意识到您正在基于HTTP构建另一个协议(protocol)。
到那时,最好重用现有的协议(protocol)(如Bayeux)和成熟的解决方案(如CometD(基于使用Bayeux协议(protocol)的Comet技术)),从而为您提供:
您不想使用仅将您绑定(bind)到HTTP的低级解决方案。您想使用更高级别的解决方案,使您的应用程序从使用的Comet技术和传输Bayeux的协议(protocol)中抽象出来,以便您的应用程序可以编写一次并利用 future 的技术改进。作为技术改进的一个示例,CometD在异步servlet出现之前一直运行良好,现在有了异步servlet才变得更具可伸缩性,因此您的应用程序无需更改应用程序中的任何一行。
通过使用更高级别的解决方案,您可以专注于您的应用程序,而不是专注于如何正确编写异步servlet的繁琐细节(这并不像人们想象的那么容易)。
您的问题的答案可能是:您使用Comet + Bayeux是因为您想要stand on the shoulder of giants。