如果你只需要comet,建议你看看evserver(http://code.google.com/p/evserver/)。它“支持鲜为人知的异步WSGI扩展”,并且建立在libevent之上。虽然实际处理程序代码有点丑陋,但它确实是异步io,可以很好地扩展,并支持django。我曾经使用过evserver,现在正在转向cyclone(基于twisted的tornado),因为我需要比evserver提供的更多一点。我需要真正的双向io(想想socket.io(http://socket.io/)),虽然evserver也可以支持它,但我认为在cyclone中重新实现
tornado's socket.io更容易(我选择了cyclone而不是tornado,因为cyclone基于twisted构建,因此允许使用twisted中未实现的更多传输(即zeromq))。Socket.io支持websockets、comet样式的轮询以及更有趣的是基于flash的websockets。我认为,在大多数实际情况下,websockets + 基于flash的websockets足以支持网站访问者的99%(根据Adobe Flash的数据,Flash渗透率约为99%(http://www.adobe.com/products/player_census/flashplayer/version_penetration.html)),只有不使用Flash的人需要回退到socket.io的其中一个备用传输(性能较差且占用资源)。但请注意,
websockets不是http传输,因此将它们放在基于http的代理(例如haproxy的http模式)后面会中断连接。最好在备用IP或端口上提供它们,以便您可以在tcp模式下进行代理(例如haproxy的tcp模式)。
回答您的问题:
(1)如果您不需要双向传输的长轮询解决方案已经足够好了(它们所做的就是保持连接打开)。当您需要连接是有状态的或者您需要能够发送和接收数据时,情况会变得棘手。在后一种情况下,socket.io 有所帮助。然而,WebSockets 是为这种情况而设计的,并且借助 flash 的支持,可用于大多数网站访问者(通过 socket.io 或独立使用,但是 socket.io 具有备份传输的附加好处,以供那些不想安装 flash 的人使用)
(2)如果您只需要推送,evserver 是您最好的选择。它在客户端使用与 orbited 相同的 JavaScript。否则,请查看 socket.io(这也需要支持服务器,唯一可用的 Python 服务器是 tornado。)
(3)这只是另一个服务器实现。如果我理解正确,它仅限于推送。将数据推送到客户端是通过从应用程序向 nginx 服务器发出 http 请求来完成的。(nginx 然后负责使其到达客户端)。如果您对此感兴趣,请查看 mongrel2(http://mongrel2.org/home),它不仅具有长轮询处理程序,还具有 WebSockets 处理程序。(这次您使用 zeromq 处理程序将数据传输到 mongrel 服务器,而不是向 mongrel 发送 http 请求)(请注意开发人员对 WebSockets 和基于 flash 的 WebSockets 缺乏热情。特别是考虑到 WebSocket 协议往往会发展,您可能需要重新编写 mongrel2 的 WebSocket 支持,以保持对 WebSocket 的支持)
(4) 除了evserver之外,所有解决方案都用其他东西替换了wsgi。尽管大多数服务器在这个“其他东西”之上也有一些wsgi支持。无论你选择什么解决方案,都要小心一个cpu密集型或其他io阻塞的请求不会阻塞服务器。(你需要多个实例或线程)。
(5) 没有太大的区别。所有解决方案都依赖于一些自定义处理程序来将数据推送(如果适用,则接收)到客户端。我提到的所有解决方案都允许使用python编写这些处理程序。如果你想使用完全不同的框架(如node.js),那么你必须权衡node.js的易用性(它被认为很容易,但它也相当实验性,并且我发现很少有库实际上是稳定的),并考虑使用现有代码库和可用库的便利性(例如,如果你的应用程序需要博客,则有很多django博客可以插入,但没有node.js的博客)。此外,不要盯着性能统计数据看。除非你打算向客户端推送愚蠢的预定义数据(所有基准测试都这样做),否则你会发现实际数据处理比最差的异步io实现增加了更多的开销。(但如果你打算有许多同时在线的客户端,仍然需要使用基于异步io的服务器,线程根本不适用于保持数千个连接处于活动状态)。
(6) WebSockets提供双向通信,长轮询/Comet只能推送数据而不能接受写入。 (Socket.io通过使用两个HTTP请求(一个用于长轮询,一个用于发送数据)来模拟此双向支持。它通过在两个请求的查询字符串中使用(会话)ID来跟踪它们的相互依赖关系)。基于Flash的WebSockets与真正的WebSockets类似(不同之处在于它们的实现在SWF中,而不是在您的浏览器中)。此外,WebSockets协议不遵循HTTP协议;长轮询/Comet协议则遵循HTTP协议(技术上,WebSocket客户端向WebSocket服务器发送升级请求,升级后的协议不再是HTTP)。