在面向 Web 的应用程序中开发优雅的 Pub-Sub 架构是一项真正的挑战。虽然有一些非常有趣的解决方案使用长轮询连接(例如 COMET)和重复超时(例如 js setTimeout)。恕我直言,AJAX 推送仍然看起来像是一层强制无辜 HTTP 协议的调整和黑客攻击。
那么您认为AJAX 推送是不是 HTTP 协议失常呢?
您可以在 Web 架构中考虑哪些其他替代方案?
在面向 Web 的应用程序中开发优雅的 Pub-Sub 架构是一项真正的挑战。虽然有一些非常有趣的解决方案使用长轮询连接(例如 COMET)和重复超时(例如 js setTimeout)。恕我直言,AJAX 推送仍然看起来像是一层强制无辜 HTTP 协议的调整和黑客攻击。
那么您认为AJAX 推送是不是 HTTP 协议失常呢?
您可以在 Web 架构中考虑哪些其他替代方案?
我以前见过的另一个选择是使用一个小的隐藏 Java 或 Flash 通过普通套接字连接到远程服务器。然后,服务器可以随时通过这些套接字推送数据/事件,而无需来自客户端的任何轮询。
Flash 比 IMO 好一点,因为它不需要签名的小程序(它会为用户弹出安全警告)。它以一种或另一种形式使用 Socket 已经有 9 年了,尽管直到 Flash 9 / AS3 才获得可用于连接任何类型服务的“纯”套接字(以前它要求消息是以“空”数据包终止,这意味着您必须专门为闪存设计协议,而不是能够使用 XMPP 或 SMTP 或任何现有协议)
您可以在 Web 架构中考虑哪些其他替代方案?
HTML 5 Web Sockets API和服务器发送的事件看起来很有前途。IE 尚不支持 Web Sockets,服务器发送的事件仍处于试验阶段。Douglas Crockford 的JSONRequest提案也将是 AJAX 推送的有趣替代方案,但它尚未在现代浏览器中实现。
目前,我会坚持使用Comet。
轮询是进行 pub-sub 的 web 架构方式。当客户端不经常轮询并且可以缓存和共享响应(例如,博客的 rss 提要)时,它工作得很好。保持每个客户端打开一个 tcp 套接字,就像使用 comet 一样,并不是使用 http 的理想方式。但是,如果您的应用程序在 Web 浏览器中运行,并且需要频繁的、唯一的、每个客户端的更新,那么这样做并不是一个坏方法。
Comet 和对每个客户端资源的轮询并不完全滥用 http 或 web —— 只是 http 和 web 被专门设计为在许多客户端之间共享相同的资源(即网页),所以这是它工作得最好的方式.
想想最常见的 Comet 实现,你必须欺骗浏览器,让浏览器认为它正在接收多部分响应或 iframe 中的无限长 html,这一事实足以引发关于这是否是适当技术的标志为了工作。