Django / Comet(推):所有的邪恶至less?

我已经阅读了关于Django和HTTP Push的所有问题和答案。 然而,没有人提供一个清晰,简洁,开始到终点的解决scheme,来解决如何完成所谓“彗星”function的基本“问候世界”。

第一个问题(1):为什么HTTP根本不是(至less到目前为止)为此做了什么? 所有的潜在解决scheme本质上是黑客?

2)目前最好的解决scheme是什么?

  • 绕行?
  • 其他一些基于扭曲的解决scheme?
  • 龙卷风?
  • Node.js的?
  • XMPP w / BOSH?

其他的解决scheme?

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

4)哪些解决scheme需要replace典型的mod_wsgi / nginx(或apache)部署模型? 为什么他们需要这个? 无论如何,这是一个有利的过渡吗?

5)使用已经在Python中的解决scheme的优势有多大?

来自PyCon 2010的Alex Gaynor的介绍,我刚刚在blip.tv上看到,是惊人的和信息丰富的,但不是在Django的HTTP Push的当前状态。 他说的一件事给了我一些信心:轨道在抽象和模拟networking套接字的概念方面做得很好。 因此,当WebSockets实际登陆时,我们将处于一个转换的好地方。

6)HTML5 Websockets与当前的解决scheme有什么不同? Gaynor对轨道转换的容易度的评估是否准确?

如果你需要的只是彗星,我会看看evserver(http://code.google.com/p/evserver/)。;

它“支持已知的asynchronousWSGI扩展”,并围绕libevent进行构build。 像魅力工作,支持Django。 实际的处理程序代码有点难看,但它的规模很好,因为它确实是async io。

我已经使用了evserver,现在我正在转向旋风(扭曲的龙卷风),因为我需要比evserver更多的东西。 我需要真正的双向io(认为socket.io(http://socket.io/)),而evserver可以支持它,我认为这是更容易重新实施龙卷风的socket.io在旋风(我select旋风,而不是龙卷风旋风是build立在扭曲,从而允许更多的运输,而不是在扭曲(ic zeromq))实施Socket.io支持websocket,彗星式的投票,以及更多的闪存基于flash的websockets。 我认为,在大多数实际情况下,基于websocket + flash的websocket足以支持99%(根据adobe flash渗透率大约99%(http://www.adobe.com/products/player_census/flashplayer/version_penetration.html))的网站访问者(只有不使用Flash的人需要退回到其中一个socket.io(较less的perfomant和资源占用)备份传输);

请注意,虽然websocket不是一个http传输,因此把它们放在基于http的代理之后(例如http模式中的haproxy)会中断连接。 在备用IP或端口上更好地服务它们,以便可以在tcp模式下进行代理(例如,tcp模式下的haproxy)。

要回答你的问题:(1)如果你不需要双向传输,基于longpolling的解决scheme是足够好的(他们所做的只是保持连接的开放)。 当你需要你的连接是有状态的,或者你需要能够发送和接收数据的时候,事情会变得很糟糕。 在后一种情况下,socket.io有帮助。 然而,websocket是针对这种情况而devise的,并且在大多数网站访问者可以使用flash的支持下(通过socket.io或standalone,但是socket.io还有不需要安装flash的人的备份传输的额外好处)

(2)如果你所需要的只是推动,evserver是你最好的select。 它在客户端使用与轨道相同的JavaScripts。 否则看看socket.io(这也需要一个支持服务器,唯一可用的Python是龙卷风。)

(3)这只是另一个服务器实现。 如果我正确读取它只是推动。 将数据推送到客户端是通过将http请求从应用程序发送到nginx服务器来完成的。 (nginx然后照顾他们到达客户端)。 如果你有兴趣的话,看看mongrel2(http://mongrel2.org/home),它不仅有处理longpolling,而且还有websockets。(而不是http请求混杂,这次你使用zeromq处理程序获取数据到你的杂种服务器)(注意开发人员对websocket和基于flash的websocket缺乏热情,特别是考虑到websocket协议的发展趋势,你可能需要在某种程度上重新编码mongrel2的websocket支持支持websockets);

(4)除evserver之外的所有解决scheme都用其他的replacewsgi。 尽pipe大多数服务器也对这个“别的东西”有一些wsgi支持。 无论您select哪种解决scheme,请注意一个cpu密集型或其他io阻塞请求不会阻塞服务器。 (你可能需要多个实例或线程)。

(5)不是很重要。 所有的解决scheme都依赖于一些自定义的处理程序来推送(如果适用的话)接收数据给客户端。 我提到的所有解决scheme都允许这些处理程序用python编写。 如果你想使用一个完全不同的框架(node.js),那么你必须权衡node.js的易用性(它被认为很容易,但它也是相当实验性的,而且我发现很less的库实际上是稳定的)使用现有代码库和可用库的便利性(例如,如果您的应用程序需要博客,那么您可以插入大量的django博客,但是对于node.js,则不需要)也不要盲目注意性能统计信息。 除非你打算把预先定义好的数据(所有的基准testing)都推送到客户端,否则你会发现实际的数据处理比最糟糕的asynchronousio实现增加更多的开销。 (但是如果你打算有很多并发的客户端,你仍然希望使用一个基于async的服务器,而线程根本不是为了保持数千个连接的存在)

(6)websockets提供双向通信,长轮询/慧星只推送数据但不接受写入。 (Socket.io通过使用两个http请求(一个用于longpoll,一个用于发送数据)来模拟这种双向支持。它通过作为这两个请求查询string的一部分的(会话)id来跟踪它们的相互依赖性。 基于闪存的websockets类似于真正的websockets(不同之处在于它们的实现在swf中,而不是在浏览器中)。 websocket协议也不遵循http协议; longpolling /慧星的东西呢 (技术上websocket客户端向websocket服务器发送升级请求,升级后的协议不再是http)

使用django-websocket支持WebSocket,但不幸的是,它有一些重要的问题来解决这个问题。 这是来自该页面的报价:

免责声明(使用django-websocket时你应该知道什么)

巨大的免责声明 – 正确的是,目前其技术上不可能以任何方式使用WSGI的websocket。 这是一个已知的问题,但是由于WSGI stadard编写时做出了一些devise决定,因此无法以一种干净的方式解决。 这时Websockets等东西不存在,也不可预测。

但是不仅WSGI是限制因素。 Django本身是围绕一个简单的请求来devise的,而不考虑Websockets。 这也意味着提供一个标准的符合websocket实现是不可能的,现在django。 然而它以某种不太可行的方式工作。 所以请注意,使用django-websocket时,tcp套接字可能会受到折磨。

所以现在呢,WSGI:不行, Django:即使使用django-websockets, 另请参阅作者原始公告中的评论:

我不能说这看起来是个好主意。 你正在以一种需要线程化的方式进行长久的连接。 django-websocket需要线程设置,如果你有进程(因为你只是有太多的进程),但线程不会同时扩展大量的连接,所以它只是一个虚假的安全。 你需要一个asynchronous平台来处理长期的事情,而我通过在Django中执行我的应用程序以及Node.js中的彗星和websocket

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

最后,您也可以决定是否太难,并使用外部服务来提供推送支持。 这就变成了向服务器发送一个简单的JSON请求的问题,而不必担心如何build立连接以及并发性如何工作等等。 当然,你需要付出代价(虽然目前在Beta版中可能是免费的),但是你不需要担心实现细节; 这样你就不会拥有WebSockets的全部function – 只需要支持即可。

回到问题2,我最近参观了使用Comet的Django应用程序的内部,Orbited是他们select的解决scheme。

我不敢相信自从我问这个问题已有六年多了。

与Django的asynchronous(以及相关的networkingstream量,例如websockets)对于我们这个社区中的许多人来说一直是个谜。 这几年我已经采取了,除其他外,从这个痒。

亨德里克斯

hendrix是在Twisted上运行的WSGI / ASGI容器。 这是一个主要由5个爱好者驱动的项目,得到了一些有远见的组织的帮助和资助。 目前正在生产数十家公司,但不是数百家公司。

我会把它留给你阅读文档,看看为什么它是这个问题的最佳解决scheme,但一些快速的亮点:

  • 它基于Twisted,不需要任何知识或者使用Twisted内部构件,但是它们都是可用的
  • 它“只是工作”的意义,你不需要任何特殊的服务器或进程configuration来执行您的Django(或Pyramid,或Flask)应用程序内的asynchronous和套接字stream量
  • 它很可能与ASGI,Django频道标准向前兼容,而且在一些有意义的方面,第一个ASGI容器
  • 它附带简单的API,可以维护视图逻辑的stream程,并且易于进行unit testing。

请参阅我在Django-NYC(在Buzzfeed办公室)给我的这个演讲 ,了解为什么我认为这是这个问题的最佳答案。