在面向Web的应用程序中开发优雅的Pub-Sub架构是一项真正的挑战。 虽然有一些非常有趣的解决方案使用长轮询连接(例如COMET)和重复超时(例如js setTimeout)。恕我直言,AJAX推动仍然看起来像一层调整和黑客强迫无辜的HTTP协议。
那么您认为 AJAX是否会推动HTTP协议异常?
您可以在网络架构中考虑哪些其他替代方案?
答案 0 :(得分:5)
我之前看到的另一个选项是使用一个小的隐藏Java或Flash通过普通套接字连接到远程服务器。然后,服务器可以随时通过这些套接字推送数据/事件,而无需从客户端进行任何轮询。
Flash是一个更好的IMO,因为它不需要签名的applet(它会弹出用户的安全警告)。它现在有9年以上的形式或者其他形式的套接字,但是直到Flash 9 / AS3你才能使用“纯”套接字连接到任何类型的服务(之前它要求消息是以'null'数据包终止,这意味着您必须专门为闪存设计协议,而不是能够使用XMPP或SMTP或任何现有协议)
答案 1 :(得分:4)
你可以选择哪些其他选择 考虑在Web架构中?
HTML 5 Web Sockets API和Server-sent Events看起来对未来充满希望。目前还没有IE支持Web套接字,而且服务器发送的事件仍然是实验性的。道格拉斯·克罗克福德(Douglas Crockford)提出的JSONRequest提议也是AJAX推送的有趣替代方案,但它尚未在现代浏览器中实现。
目前,我会坚持使用Comet。
答案 2 :(得分:2)
轮询是做pub-sub的网络架构方式。当客户端不经常轮询并且可以缓存和共享响应时(例如,博客的RSS提要),它可以很好地工作。保持每个客户端打开一个tcp套接字,就像使用comet一样,不是使用http的理想方式。但是,如果您的应用程序在Web浏览器中运行,并且需要频繁,独特的每个客户端更新,那么这并不是一种糟糕的方式。
对于每个客户端资源的Comet和轮询并不是完全滥用http或网络 - 只是http和网络专门设计用于在许多客户端之间共享相同的资源(即网页),所以这就是方式它效果最好。答案 3 :(得分:1)
考虑一下最常见的Comet实现,只是你必须欺骗浏览器认为它在iframe中接收多部分响应或无限长的html足以引发一个关于这是否合适的标志的事实是否有技术。