comet - 异步servlet长轮询和bayeux协议(protocol)( cometd )之间的区别

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

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

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

我知道 Comet 是这类技术的总称; 'Bayeux' 是协议(protocol)。但是当我查看 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 协议(protocol)有什么区别?

谢谢

最佳答案

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    关于comet - 异步servlet长轮询和bayeux协议(protocol)( cometd )之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14268606/

    相关文章:

    mysql - 克服 PHP/MySQL + Ajax/comet/long polling 的方法?

    google-app-engine - AppEngine Channel API 的 Amazon EC2 等效项是什么?

    java - Spring的DeferredResult setResult与超时的交互

    javascript - 如何使用 PHP 和 Javascript 实现服务器推送/长轮询/comet

    .net - WebOrb.net/替代品

    .net - 调查从服务器通知 WPF 客户端的解决方案

    php - 如何实现基本的 "Long Polling"?

    java - 如何找出在Tomcat中运行的servlet的实例数?

    java - 使用 Google 应用引擎将字节数组转换为 Java 中的图像