Django/Comet(推):所有邪恶中最小的?

Django/Comet(推):所有邪恶中最小的?,django,comet,Django,Comet,我已经阅读了所有关于Django和HTTP推送的问题和答案。然而,没有一个能提供一个关于如何实现所谓“comet”功能的基本“hello world”的清晰、简洁、从头到尾的解决方案 第一个问题(1):HTTP在多大程度上没有(至少到目前为止)解决这个问题?所有潜在的解决方案都是黑客吗 2) 目前可用的最佳解决方案是什么 绕轨道飞行 其他基于Twisted的解决方案 龙卷风 node.JS 带波什的XMPP 还有别的解决办法吗 3) nginx推送模块如何参与本次讨论 4) 以下哪种解决方案

我已经阅读了所有关于Django和HTTP推送的问题和答案。然而,没有一个能提供一个关于如何实现所谓“comet”功能的基本“hello world”的清晰、简洁、从头到尾的解决方案

第一个问题(1):HTTP在多大程度上没有(至少到目前为止)解决这个问题?所有潜在的解决方案都是黑客吗

2) 目前可用的最佳解决方案是什么

  • 绕轨道飞行
  • 其他基于Twisted的解决方案
  • 龙卷风
  • node.JS
  • 带波什的XMPP
还有别的解决办法吗

3) nginx推送模块如何参与本次讨论

4) 以下哪种解决方案需要替换典型的mod_wsgi/nginx(或apache)部署模型?他们为什么需要这个?无论如何,这是一个有利的转变吗

5) 使用Python中已有的解决方案的优势有多大

Alex Gaynor在PyCon 2010上的演示(我刚刚在blip.tv上观看)令人惊讶,内容丰富,但对于Django中HTTP推送的当前状态并不是非常具体。他说的让我有信心的一件事是:Orbited在抽象和模拟网络套接字的概念方面做得很好。因此,当WebSocket实际落地时,我们将处于一个良好的过渡位置


6) HTML5 WebSocket与当前的解决方案有何不同?Gaynor对从Orbited过渡容易程度的评估准确吗?

关于问题#2,我最近参观了Django应用程序的内部,该应用程序大量使用Comet,Orbited是他们选择的解决方案。

有人支持WebSocket,但不幸的是,它在工作方面存在重大问题;下面是该页的一段引语:

大肥肉免责声明-就目前而言,技术上不可能将websocket与WSGI结合使用。这是一个已知的问题,但由于在编写WSGI标准时做出了一些设计决策,因此无法以干净的方式解决。在这个时候,WebSocket等东西并不存在,也不可预测

但不仅WSGI是限制因素。Django本身是围绕一个简单的请求到响应场景设计的,没有考虑WebSocket。这也意味着,对于django来说,现在不可能提供标准的Compliant websocket实现。然而,它以一种不那么漂亮的方式工作。所以请注意,在使用django websocket时,tcp套接字可能会受到折磨

所以现在,WSGI:不行;Django:几乎没有任何进展,即使使用Django WebSocket;另请参见作者的评论:

我不能说这是个好主意。您正在以需要线程的方式进行长寿命连接。django websocket需要线程设置,如果有进程(因为进程太多)则无法工作,但线程也无法同时扩展到许多连接,因此这只是一种错误的安全性。你需要一个异步平台来实现长寿命的东西,我通过在Django中运行我的应用程序,在Node.js中运行comet和websocket来实现这一点

就个人而言,如果尝试使用WebSockets(我预计明年会使用),我会尝试和first的组合。它们被设计用来处理WebSocket,并且可以很好地扩展。如果您正确地编写代码以消除对Django不必要的依赖,那么您应该能够在基于Twisted的系统中使用大部分代码。与使用Node.js、Comet或其他语言的任何系统相比,这是一个非常明显的优势。你也可以做一个简单的推


最后,您还可以决定这太难了,使用外部服务来提供推送支持。这就变成了向服务器发送一个简单的JSON请求的问题,而不用担心如何建立连接以及并发性如何工作等等。当然,您需要为它付费(尽管目前它在Beta版中可能是免费的),但您不需要担心实现细节;不过,这样您就不会拥有WebSocket的全部功能—只需推送支持即可。

我想看看evserver(http://code.google.com/p/evserver/)如果你只需要comet

它“支持[鲜为人知的]异步WSGI扩展”,是围绕libevent构建的。工作起来很有魅力,支持django。实际的处理程序代码有点难看,但它的伸缩性很好,因为它实际上是异步io

我已经使用了evserver,目前我正在转向cyclone(twisted上的tornado),因为我需要的不仅仅是evserver Offers。我需要真正的双向io(想想socket.io(http://socket.io/))虽然evserver可以支持它,但我认为在cyclone中重新实现更容易(我选择cyclone而不是tornado,因为cyclone构建在twisted上,因此允许更多twisted(I.c.zeromq)中未实现的传输)Socket.io支持WebSocket,comet风格的轮询,更重要的是,基于flash的WebSocket。我认为在大多数实际情况下,websockets+基于flash的websockets足以支持99%(根据adobe flash的普及率约为99%)(http://www.adobe.com/products/player_census/flashplayer/version_penetration.html))一个网站的访问者(只有不使用flash的人需要退回到socket.io中的一个)(性能和资源占用较少)备份传输

请注意,WebSocket不是http传输,因此将其置于基于http的代理之后(例如http模式下的haproxy)会中断连接。最好在备用ip或端口上为其提供服务,以便您可以在tcp模式下代理(例如tcp模式下的haproxy)

回答您的问题: (1) 如果您不需要双向传输,那么基于轮询的解决方案已经足够好了(它们所做的只是保持连接打开)。当您需要连接状态完整或需要时,情况确实会变得不确定