确实,“Comet”是这些技术的术语,但贝叶协议仅被少数实现使用。 Comet 技术可以使用它想要的任何协议;巴约就是其中之一。
话虽如此,异步 servlet 解决方案和 Comet+Bayeux 解决方案之间有两个主要区别。
第一个区别是 Comet+Bayeux 解决方案独立于传输 Bayeux 的协议。
在里面CometD http://cometd.org项目中,客户端和服务器都有可承载 Bayeux 的可插拔传输。
您可以使用 HTTP 携带它,Bayeux 是 POST 请求的内容,但您也可以使用 WebSocket 携带它,Bayeux 是 WebSocket 消息的有效负载。
如果您使用异步 servlet,则无法利用 WebSocket,这是更有效率 http://webtide.intalio.com/2011/09/cometd-2-4-0-websocket-benchmarks/比 HTTP。
第二个区别是异步 servlet 仅承载 HTTP,而您需要更多的内容来处理远程 Comet 客户端。
例如,您可能希望唯一地标识客户端,以便同一页面的 2 个选项卡会产生 2 个不同的客户端。为此,您需要向异步 servlet 请求添加一个“属性”,我们称之为sessionId
.
接下来,您希望能够对客户端进行身份验证;只有经过身份验证的客户端才能获得sessionId
。但是为了区分第一个进行身份验证的请求和其他已经经过身份验证的后续请求,您需要另一个属性,例如messageType
.
接下来,您希望能够快速通知由于网络丢失或其他连接问题而导致的断开连接;所以你需要想出一个心跳解决方案,如果心跳有跳动,你就知道连接还活着,如果没有跳动,你就知道它已经死了,并执行救援行动。
接下来您需要断开连接功能。等等。
您很快就会意识到您正在 HTTP 之上构建另一个协议。
此时,最好重用 Bayeux 等现有协议以及 CometD(基于使用 Bayeux 协议的 Comet 技术)等经过验证的解决方案,它可以为您提供:
- Java 和 JavaScript 客户端库,具有简单但功能强大的 API
- Java 服务器库,用于执行应用程序逻辑,无需通过带注释的服务处理 HTTP 或 WebSocket 等底层细节
- 客户端和服务器的传输可插拔性
- 贝叶协议可扩展性
- 懒惰的消息
- 聚类
- 顶级性能
- 面向未来:在 WebSocket 出现之前,CometD 的用户无需更改一行代码即可利用 WebSocket - 所有魔法都在库中实现
- 基于标准
- 由网络协议专家设计和维护
- 扩展文档 http://docs.cometd.org
- 我可以继续,但你明白了:)
您不想使用仅将您与 HTTP 联系在一起的低级解决方案。您希望使用更高级别的解决方案,将您的应用程序从所使用的 Comet 技术和传输 Bayeux 的协议中抽象出来,以便您的应用程序可以编写一次并利用未来的技术改进。作为技术改进的一个例子,CometD 在异步 servlet 出现之前就运行良好,现在异步 servlet 变得更具可扩展性,因此您的应用程序无需更改应用程序中的任何一行。
通过使用更高级别的解决方案,您可以专注于您的应用程序,而不是如何正确编写异步 Servlet 的血腥细节(这并不像人们想象的那么容易)。
您的问题的答案可能是:您使用 Comet+Bayeux 因为您想要站在巨人的肩膀上 http://en.wikipedia.org/wiki/Standing_on_the_shoulders_of_giants.