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

时间:2010-11-30 05:06:09

标签: django comet

我已经阅读了有关Django和HTTP Push的所有问题和答案。然而,没有一个提供关于如何完成所谓“彗星”功能的基本“hello world”的清晰,简洁,开端到终端的解决方案。

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

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

  • 绕行?
  • 其他一些基于Twisted的解决方案?
  • 龙卷风?
  • Node.js的?
  • XMPP w / BOSH?

其他一些解决方案?

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

4)这些解决方案中的哪一个需要替换典型的mod_wsgi / nginx(或apache)部署模型?他们为什么要这个?在任何情况下这都是有利的过渡吗?

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

Alex Gaynor在PyCon 2010上发表的演讲,我刚刚在blip.tv上观看过,它非常精彩且内容丰富,但对Django中HTTP Push的当前状态并不十分特别。他说的一件事给了我一些信心:Orbited在抽象和模拟网络套接字的概念方面做得很好。因此,当WebSockets实际着陆时,我们将处于转型的好地方。

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

4 个答案:

答案 0 :(得分:24)

答案 1 :(得分:7)

支持django-websocket的WebSockets,但遗憾的是它有很多问题需要它才能正常工作;这是该页面的引用:

  

Disclaimer (what you should know when using django-websocket)

     

BIG FAT免责声明 - 目前技术上 NOT 可以以任何方式使用带有WSGI的websocket。这是一个已知问题,但由于在编写WSGI标准时做出的一些设计决策,无法以干净的方式解决这个问题。此时像Websockets等的东西不存在,也不可预测。

     

...

     

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

目前,WSGI:没有去; Django:即使使用django-websockets也几乎没有任何进展;另见作者original announcement中的评论:

  

我不能说这看起来是个好主意。你正在以一种需要线程的方式进行长期连接。 django-websocket需要线程设置,如果你有进程(因为你只有太多的进程),它将无法工作,但是线程也不能同时扩展到很多连接,所以它只是虚假的安全。你需要一个用于长寿命的异步平台,我通过在Django中使用我的应用程序以及在Node.js中使用我的彗星和websocket来实现这一点

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

最后,你还可以决定它太难了并使用外部服务来提供推送支持。那就变成了向他们的服务器发送一个简单的JSON请求,而不是担心如何建立连接以及并发将如何工作以及类似的事情。当然,您需要为此付费(虽然目前在Beta版本中可能是免费的),但您无需担心实施细节;你不会拥有WebSockets的全部功能 - 只需推动支持。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

自从我提出这个问题以来,我无法相信这已经过去了六年。

与Django异步(以及相关的网络流量,例如websockets)对于我们社区中的许多人来说都是一个痒。过去几年我采取了这些措施,除其他外,抓住了这个痒。

hendrix

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

我会留给您阅读文档以了解为什么它是解决此问题的最佳解决方案,但有几个快速亮点:

  • 它基于Twisted,不需要知识或使用Twisted internals,但让它们全部可用
  • 它"只是工作"从某种意义上说,您不需要任何特殊的服务器或进程配置来从Django(或金字塔或Flask)应用程序中执行异步和套接字流量
  • 它很可能与ASGI(Django Channels标准)向前兼容,并且以一些有意义的方式成为第一个ASGI容器
  • 它附带简单的API,可以维护视图逻辑的流程,并且易于进行单元测试。

请参阅我在Django-NYC(在Buzzfeed办事处)提供的this talk,了解有关我认为这是此问题的最佳答案的原因的更多信息。