如果您需要的只是彗星,我会看看 evserver (http://code.google.com/p/evserver/)。
它“支持鲜为人知的异步 WSGI 扩展”并且是围绕 libevent 构建的。工作起来就像一个魅力并且支持 django。实际的处理程序代码有点难看,但它的扩展性很好,因为它确实是异步 io。
我已经使用了 evserver,目前正在转向 cyclone(tornado ontwisted),因为我需要的不仅仅是 evserver 提供者。我需要真正的双向io(想想socket.io(http://socket.io/)),虽然evserver可以支持它,但我认为重新实现更容易龙卷风的socket.io http://ttps://github.com/SocketTornadIO/SocketTornad.IO在 cyclone 中(我选择了 cyclone 而不是tronado,因为 cyclone 是建立在twisted 之上的,因此允许更多未在twisted 中实现的传输(即zeromq))Socket.io 支持 websockets、彗星式轮询,以及更有趣的功能,基于闪存的网络套接字。我认为在大多数实际情况下websockets + 基于flash的websockets足以支持99%(根据adobe flash渗透率约为99%(http://www.adobe.com/products/player_census/flashplayer/version_penetration.html))网站访问者的数量(只有不使用 Flash 的人需要回退到 socket.io 之一(性能较差且占用资源)备份传输)
但请注意websockets 不是 http 传输因此将它们放在基于 http 的代理(例如 http 模式下的 haproxy)后面会破坏连接。最好在备用 IP 或端口上为它们提供服务,以便您可以在 tcp 模式下进行代理(例如 tcp 模式下的 haproxy)。
回答您的问题:
(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 的处理程序。(这次您不是向 mongrel 发出 http 请求,而是使用 Zeromq 处理程序来将数据获取到您的 mongrel 服务器)(请注意开发人员对 websockets 和基于 flash 的 websocket 缺乏热情。特别是考虑到 websocket 协议往往会发展,您可能在某些时候需要自己重新编码 mongrel2 的 websocket 支持支持 websocket)
(4) 除了evserver之外的所有解决方案都用其他东西替换了wsgi。尽管大多数服务器在这个“其他东西”之上也有一些 wsgi 支持。无论您选择哪种解决方案,请注意一个 cpu 密集型或其他 io 阻塞请求不会阻塞服务器。 (您要么需要多个实例或线程)。
(5) 不是很显着。所有解决方案都依赖于一些自定义处理程序来将数据推送(以及接收)数据到客户端。我提到的所有解决方案都允许用 python 编写这些处理程序。如果你想使用一个完全不同的框架(node.js),那么你必须权衡node.js的易用性(它被认为很容易,但它也是相当实验性的,我发现很少有库真正稳定)使用现有代码库和可用库的便利性(例如,如果您的应用程序需要博客,则可以插入大量 django 博客,但没有适用于 Node.js 的博客) 另外,不要盲目关注性能统计数据。除非您计划将愚蠢的预定义数据(所有基准测试都是这样做的)推送给客户端,否则您会发现数据的实际处理会增加much甚至比最糟糕的异步 io 实现还要多的开销。 (但是,如果您计划有许多并发客户端,您仍然希望使用基于异步 io 的服务器,线程根本不意味着保持数千个连接处于活动状态)
(6) websockets提供双向通信,长轮询/comet只推送数据但不接受写入。 (Socket.io 通过使用两个 http 请求来模拟这种双向支持,一个请求长轮询,一个发送数据。它通过作为两个请求查询字符串一部分的(会话)id 来跟踪它们的相互依赖性)。基于 flash 的 websocket 与真正的 websocket 类似(不同之处在于它们的实现是在 swf 中,而不是在浏览器中)。还websockets协议不遵循http协议;长轮询/彗星的东西确实(从技术上讲,websocket客户端向websocket服务器发送升级请求,升级后的协议不再是http)