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

Bas*_*Roy 8 comet server-push reverse-ajax bayeux servlet-3.0

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

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

据我所知,Comet是这类技术的总称.'Bayeux'是协议.但是,当我查看servlet规范时,即使是"异步servlet"似乎也完成了同样的事情.我的意思是我可以定义一个简单的servlet

<async-supported>
Run Code Online (Sandbox Code Playgroud)

web.xml中的属性设置为true; 并且该servlet将能够异步地向客户端发送响应.然后我可以有一个基于jQuery或ExtJS的ajax客户端,只是一直在做

long_polling() 
Run Code Online (Sandbox Code Playgroud)

调用servlet.类似于以下链接中描述的内容 http://www.ibm.com/developerworks/web/library/wa-reverseajax1/index.html#long

所以我的问题是:

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

谢谢

sbo*_*det 26

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

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

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

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

例如,您可能希望唯一地标识客户端,以便同一页面的2个选项卡产生2个不同的客户端.为此,您需要为异步servlet请求添加"属性",让我们调用它sessionId.

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

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

接下来需要断开连接功能.等等.

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

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

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

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

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

你的问题的答案可能是:你使用Comet + Bayeux,因为你想站在巨人的肩膀上.