异步servlet长轮询和bayeux协议(Comet)之间的区别

时间:2013-01-10 22:41:25

标签: comet server-push servlet-3.0 reverse-ajax bayeux

简单的Async servlet与Comet / Bayeux协议有什么区别?

我正在尝试实现一种“服务器推送”(或“反向Ajax”)类型的网页,当服务器上发生事件时,该网页将从服务器接收更新。因此,即使没有客户端明确发送请求,我也需要服务器能够将响应发送到特定的客户端浏览器。

据我所知,Comet是这类技术的总称。 'Bayeux'是协议。但是,当我查看servlet规范时,即使是“异步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

所以我的问题是:

简单的Async servlet与Comet / Bayeux协议有什么区别?

由于

1 个答案:

答案 0 :(得分:26)

“Comet”确实是这些技术的术语,但Bayeux协议仅用于少数实现。 Comet技术可以使用它想要的任何协议;巴约就是其中之一。

话虽如此,异步servlet解决方案与Comet + Bayeux解决方案之间存在两个主要区别。

第一个区别是Comet + Bayeux解决方案独立于传输Bayeux的协议。 在CometD项目中,可以为可以承载Bayeux的客户端和服务器提供可插拔传输。 您可以使用HTTP来承载它,Bayeux是POST请求的内容,但您也可以使用WebSocket来承载它,Bayeux是WebSocket消息的有效载荷。 如果使用异步servlet,则无法利用WebSocket,它是way more efficient而不是HTTP。

第二个区别是异步servlet只携带HTTP,你需要更多来处理远程Comet客户端。

例如,您可能希望唯一地标识客户端,以便同一页面的2个选项卡产生2个不同的客户端。为此,您需要向异步servlet请求添加“属性”,我们称之为sessionId

接下来,您希望能够对客户端进行身份验证;只有经过身份验证的客户才能获得sessionId。但要区分首次进行身份验证的请求和其他已经过身份验证的后续请求,您需要另一个属性,例如messageType

接下来,您希望能够通过网络丢失或其他连接问题快速通知断开连接;所以你需要想出一个心跳加速的解决方案,这样如果心脏跳动,你知道连接是活的,如果它没有击败你知道它已经死了,并执行救援行动。

接下来,您需要断开连接功能。等等。

很快你意识到你正在构建另一个基于HTTP的协议。

此时,最好重复使用像Bayeux这样的现有协议,以及CometD(基于使用Bayeux协议的Comet技术)等经过验证的解决方案,它们可以为您提供:

  • 具有简单但功能强大的API的Java和JavaScript客户端库
  • 用于执行应用程序逻辑的Java服务器库,无需通过带注释的服务处理HTTP或WebSocket等低级别详细信息
  • 传输可插拔性,包括客户端和服务器
  • Bayeux协议可扩展性
  • 懒惰消息
  • 聚类
  • 最佳表现
  • 未来证明:在WebSocket出现之前CometD的用户没有改变一行代码来利用WebSocket - 所有的魔力都在库中实现了
  • 基于标准
  • 由网络协议专家设计和维护
  • 扩展documentation
  • 我可以继续,但你明白了这一点:)

您不希望使用仅与HTTP绑定的低级别解决方案。您希望使用更高级别的解决方案,从使用的Comet技术和传输Bayeux的协议中抽象您的应用程序,以便您的应用程序可以编写一次并利用未来的技术改进。作为技术改进的一个例子,CometD在异步servlet出现之前运行良好,现在异步servlet变得更具可扩展性,因此您的应用程序也可以在应用程序中更改单行。

通过使用更高级别的解决方案,您可以专注于您的应用程序而不是如何正确编写异步servlet的血腥细节(并且它并不像人们想象的那么容易)。

你的问题的答案可能是:你使用Comet + Bayeux是因为你想要stand on the shoulder of giants