如果您只需要彗星,我会看看 evserver (http://code.google.com/p/evserver/)。
它“支持 [the] 鲜为人知的异步 WSGI 扩展”并且是围绕 libevent 构建的。像魅力一样工作并支持 django。实际的处理程序代码有点难看,但它的扩展性很好,因为它确实是异步 io。
我已经使用了 evserver,并且我目前正在转向旋风(扭曲的龙卷风),因为我需要的不仅仅是 evserver offsers。我需要真正的双向 io(想想 socket.io (http://socket.io/)),虽然 evserver 可以支持它,但我认为在旋风分离器中重新实现 tornado's socket.io 更容易(我选择旋风分离器而不是龙卷风,因为旋风分离器是建立在 twisted 之上,因此允许在 twisted (ic zeromq) 中未实现的更多传输)Socket.io 支持 websockets、comet 样式轮询,以及更有趣的基于 flash 的 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) 如果您不需要双向传输,基于 longpolling 的解决方案就足够了(它们所做的只是保持连接打开)。当你需要你的连接是有状态的或者你需要能够发送和接收数据时,事情确实会变得不确定。在后一种情况下,socket.io 会有所帮助。然而,websockets 是为这种情况而设计的,并且在 flash 的支持下,大多数网站访问者都可以使用它(通过 socket.io 或独立,但是 socket.io 为那些不想安装 flash 的人提供了备份传输的额外好处)
(2) 如果您只需要推送,那么 evserver 是您最好的选择。它在客户端使用与轨道相同的 javascript。再看看socket.io(这也需要一个支持服务器,唯一可用的python是tornado。)
(3) 这只是另一种服务器实现。如果我正确阅读它,它只是推动。将数据推送到客户端是通过从您的应用程序向 nginx 服务器发出 http 请求来完成的。 (nginx 然后照顾他们到达客户端)。如果您对此感兴趣,请查看 mongrel2 (http://mongrel2.org/home) 它不仅有用于 longpolling 的处理程序,还有用于 websockets 的处理程序。(这次您使用 zeromq 处理程序而不是向 mongrel 发出 http 请求将数据传输到您的 mongrel 服务器)(请注意开发人员对 websocket 和基于 flash 的 websocket 缺乏热情。特别是考虑到 websocket 协议趋于发展,在某些时候,您可能需要自己重新编码 mongrel2 的 websocket 支持支持 websockets)
(4) 除 evserver 之外的所有解决方案都将 wsgi 替换为其他解决方案。尽管大多数服务器在这个“其他东西”之上也有一些 wsgi 支持。无论您选择哪种解决方案,都要小心一个 cpu 密集型或其他 io 阻塞请求不会阻塞服务器。 (您需要多个实例或线程)。
(5) 不是很重要。所有解决方案都依赖于一些自定义处理程序来向客户端推送(并且,如果适用的话,接收)数据。我提到的所有解决方案都允许这些处理程序用 python 编写。如果你想使用一个完全不同的框架(node.js),那么你必须权衡 node.js 的易用性(它被认为很容易,但它也是相当实验性的,我发现很少有库实际上是稳定的)反对使用现有代码库和可用库的便利性(例如,如果您的应用程序需要一个博客,那么您可以插入大量 django 博客,但对于 node.js 则没有) 另外不要对性能统计数据视而不见。除非您计划将愚蠢的预定义数据(所有基准测试所做的)推送到客户端,否则您会发现数据的实际处理会比最糟糕的异步 io 实现增加多更多的开销。 (但是,如果您计划同时拥有许多客户端,您仍然希望使用基于异步 io 的服务器,线程并不意味着保持数千个连接处于活动状态)
(6) websockets 提供双向通信,长轮询/彗星只推送数据但不接受写入。 (Socket.io 通过使用两个 http 请求来模拟这种双向支持,一个用于长轮询,一个用于发送数据。它通过作为两个请求查询字符串的一部分的(会话)id 来跟踪它们的相互依赖性)。基于 flash 的 websocket 类似于真正的 websocket(不同之处在于它们的实现是在 swf 中,而不是在您的浏览器中)。另外 websockets 协议不遵循 http 协议; longpolling/comet 的东西(从技术上讲,websocket 客户端向 websocket 服务器发送升级请求,升级后的协议不再是 http)