【问题标题】:Difference between async servlet long poll and bayeux protocol (Comet)异步servlet长轮询和bayeux协议(彗星)之间的区别
【发布时间】:2012-12-25 11:18:18
【问题描述】:

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    确实,“彗星”是这些技术的术语,但 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

    【讨论】:

    • 哇!!感谢您的详细回答。这回答了我的大部分问题。我将保持这个问题开放,看看是否有其他人回复。否则我会关闭它。再次感谢。
    • 嗨,有没有基于 Ext JS 的 CometD 客户端代码可以指点我?
    • 嗨,不,我认为没有 Ext JS 客户端与 Cometd 的直接示例,但你可以肯定地实现它,这很容易,因为我做过一次。
    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多