“长轮询”是创建Web实时应用程序的最有效方式吗?

12
我想创建一个像这样的应用程序:

http://collabedit.com/

最有效的创建这种实时应用程序的方法是什么? Flash?长轮询?HTTP流?还是其他方法? 谢谢;)
3个回答

14

目前,长轮询可能是最好的解决方案。许多大型网站都使用了长轮询实现,包括Facebook、Google和eBay。并非所有人都在浏览器中安装或启用了Flash。未来,Web Sockets也许能够更轻松地为我们完成这项工作。

更新:截至本文撰写时,WebSocket API已在最新的WebKit(Chrome/Safari)和Firefox 4 beta中实现。Opera也有一个公共快照版本可供下载,其中包含了该API的实现。这意味着API测试已经广泛可用。有关更多信息,请参见此答案


1
+1 我喜欢长轮询。未来可能会有所不同,但我不会选择Flash。 - Plynx
2
@xRobot:你查看过常见问题解答了吗?[http://www.phpfreechat.net/faq] 它提供了一个解决与磁盘访问相关的性能问题的方案。除此之外,你需要一个非常高功率的服务器才能处理数百万个同时连接。正常的HTTP请求是打开->获取数据->关闭,因此同时连接较少。使用长轮询时,它是打开->等待数据->关闭,因此几乎可以保证有很多同时连接。服务器只能处理有限数量的并发连接,你懂的,一分钱一分货! - Andy E
我不认为谷歌使用长轮询来实现Comet。至少,Gmail使用XHR流来实现Comet。 - Morgan Cheng
1
+1,实现完全跨浏览器的最佳方法是长轮询,这在许多彗星服务器中得到了实现。对于gtalk提到的hack是htmlfile流,它是不同的,并且有其自身的限制:http://cometdaily.com/2007/11/18/ie-activexhtmlfile-transport-part-ii/。 - Jerod Venema
虽然最近的 WebKit 可能支持它,但中间的旧基础设施设备可能仍会阻止 WS 协议。考虑回退到 xhr-polling 是合理的选择。 - ZeroCool
显示剩余2条评论

4
所有不同的方法都有不同的优缺点,我对它们的区别不是专家,所以我建议避免做出选择,避免涉及每种方法包含的开发和调优,避免未来可用技术的更改(例如 HTML5 WebSocket 的到来),使用一个抽象出传输方法并基于客户端能力选择最佳方法的库: http://socket.io/ 这个精彩的库让创建实时应用程序变得非常简单!而且还有各种服务器端实现:Python (Tornado)、Java、Google GO、Rack(Ruby),除了主流的 Node.js(服务端 JavaScript)实现。

是的..!! 我已经在Java和NodeJS中都使用过它。这是一个非常棒的工具。对于Java,我们可以使用Netty服务器实现。 - Aman Gupta

1

我认为长轮询不是实现Comet最有效的方式。无论如何,它在收到响应后会发送新的HTTP请求。这比HTTP流式传输需要更多的额外HTTP请求。

但是,长轮询可能比HTTP流式传输更可靠且更易于实现。根据Google Code中的文章,如果中间的HTTP代理缓冲内容,则HTTP流式传输可能无法正常工作。

有趣的是,Gmail并没有使用长轮询。通过Http sniffer的帮助,可以清楚地看到它使用HTTP流式传输来实现Comet。


Facebook也不使用长轮询吗?你知道有关HTTP流的任何示例吗?谢谢 ^_^ - xRobot
我个人还没有测试过,但据说 Facebook 聊天是通过长轮询实现的。GMail 是 Http 流。 Outlook Web Access 也是。 - Morgan Cheng
@xRobot,如果你正在寻找如何操作的话,这个URL是一个很好的总结:http://cometdaily.com/2007/12/11/the-future-of-comet-part-1-comet-today/。 - Morgan Cheng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接