8

简单的 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 协议有什么区别?

谢谢

4

1 回答 1

26

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

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

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

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

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

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

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

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

很快您就会意识到您正在 HTTP 之上构建另一个协议。

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

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

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

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

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

于 2013-01-10T23:51:43.357 回答