姜戈/彗星(推):万恶之中最小的?

2024-01-02

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

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

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

  • Orbited?
  • 还有其他基于 Twisted 的解决方案吗?
  • 龙卷风?
  • 节点.JS?
  • XMPP 与 BOSH?

还有其他解决方案吗?

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

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

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

我刚刚在 blip.tv 上观看了 PyCon 2010 上 Alex Gaynor 的演讲,内容非常精彩且信息丰富,但对于 Django 中 HTTP 推送的当前状态并没有非常具体。他说的一件事给了我一些信心:Orbited 在抽象和模拟网络套接字概念方面做得很好。因此,当 WebSocket 真正落地时,我们将处于一个过渡的好位置。

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


如果您需要的只是彗星,我会看看 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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

姜戈/彗星(推):万恶之中最小的? 的相关文章

  • Django SECURE_SSL_REDIRECT 破坏了使用内置客户端的单元测试

    我正在开发一个已经有数百个单元测试的项目 其中许多使用内置的 django 客户端或 django 休息框架 APIClient 来发出请求和测试响应 最近实现了使 SSL 在本地工作的必要条件 并设置SECURE SSL REDIRECT
  • 如何在heroku-django项目中设置环境变量?

    我的 settings py 中有这段代码 EMAIL HOST smtp sendgrid net EMAIL HOST USER os environ get EMAIL HOST USER EMAIL HOST PASSWORD os
  • 如何防止 Django 解释包含大引号的块?

    我正在开发一个使用 Django 模板的网站 并且我必须生成包含成对的大引号的 HTML 有没有办法禁用 Django 对代码块的标签处理 像文字块标签这样的东西会很好 这样 literal LITERAL BRACES endlitera
  • 无法弄清楚为什么 form.has_changed() 总是 true?

    我正在尝试学习 Django 但遇到了一个我无法弄清楚的情况 我有以下代码 def contact add request if request method POST form ContactManageForm request POST
  • NGinx 和 Django,提供大文件 (3gb+)

    我在提供大文件下载 上传 3GB 时遇到一些问题 由于我使用的是 Django 我猜想提供文件的问题可能来自 Django 或 NGinx 在我启用 NGinx 的网站中 我有 server client max body size 4G
  • Django - 从另一个应用程序加载静态文件

    在 app1 中 我尝试从 app2 加载静态文件 我设置了没有STATICFILES FINDERS在项目中settings py 意思是 Django 将使用默认值 https docs djangoproject com en 1 1
  • 测试内联表单集清理方法

    我有一个 Django 项目 有 2 个模型 一个Structure and Bracket 括号具有结构的外键 即一对多 一个结构有多个括号 我创建了一个TabularInline对于管理站点 这样结构上就会有一个括号表 我添加了一个自定
  • Django CommandError:应用程序“民意调查”有迁移

    尝试按照教程进行操作Django项目 https docs djangoproject com en 1 6 intro tutorial01 我遇到的问题是执行命令时 python manage py sql polls我收到错误 Com
  • Heroku 找不到 Django 模板

    我得到了一个TemplateDoesNotExistHeroku 查找我的 html 文件时出错 文件全部在开发服务器上同步 这TEMPLATE DIRS设置被设置为 TEMPLATE DIRS Users jonathanschen Py
  • 带有 self 实例的 Django 模型方法

    我试图将一些功能逻辑转移到模型的方法中 而不是视图中 我认为它属于 class Spans models Model snow models IntegerField wind models IntegerField exposure mo
  • 如何在Django中使cache_page失效?

    问题是 我有博客应用程序 并且我将帖子输出视图缓存了 5 分钟 cache page 60 5 def article request slug 但是 每当向帖子中添加新评论时 我想使缓存失效 我想知道如何最好地做到这一点 我见过this
  • Django 嵌套查询集

    我有一个像这样的 Django 数据模型 省略数据字段 class Atom Model pass class State Model atom ForeignKey Atom class Transition Model atom For
  • 没有实例的 Django Formset

    In this http docs djangoproject com en dev topics forms modelforms inline formsetsDjango Doc 解释了如何创建一个表单集 该表单集允许您编辑属于特定作
  • 在 django 中运行普通 sql 查询时如何获取字段名称

    在我的 django 视图之一中 我使用纯 sql 不是 orm 查询数据库并返回结果 sql select from foo bar cursor connection cursor cursor execute sql rows cur
  • 在 Python/Django 中递归收集子级

    我有一个这样的模型 class Person models Model name models CharField max length 55 null False blank False parent models ForeignKey
  • 使用 django-allauth 时 Django 无法找到静态文件

    当我使用 allauth 时 一切似乎都工作正常 除了 Django 现在无法找到静态文件 如果没有 allauth 所有静态文件都会被渲染 allauth 的设置需要添加 TEMPLATE CONTEXT PROCESSORS allau
  • Django - 在处理端点请求之前验证 AWS Cognito 令牌是否有效

    因此 我使用下面的代码来检查 AWS Cognito 令牌 我显然不想将这 6 行代码添加到每个端点 另外 我不知道这是否是验证我正在做的所有事情的正确方法 即期望令牌的格式为 解析它并仅解码 JWT 令牌部分 如何对每个请求附带的 AWS
  • 无法为 Django 的重置密码流程创建集成测试

    我正在尝试对密码重置流程实施集成测试 但我陷入了 密码重置 确认 视图 我已经手动测试了该流程 并且工作正常 不幸的是 Django 单元测试客户端似乎无法正确遵循此视图中所需的重定向 网址配置 from django contrib au
  • 是否可以将 FastAPI 与 Django 一起使用?

    我是一名 Django 开发人员 最近偶然发现了 FastAPI 框架 然后我决定尝试一下 但通常当您谈论使用 Django 构建 RESTful API 时 您通常会使用 Django Rest Framework DRF 有人知道是否可
  • Django DetailView 按外键过滤

    我有点困惑 想利用 DetailView 功能 使用外键作为我的过滤器来显示数据 基本上我的模型看起来像这样 class Category models Model name models CharField max length 30 s

随机推荐

  • 将 Jersey JUL 日志记录重定向到 Log4j2

    我需要将 Jersey 请求 响应日志重定向到我的 log4j2 我通过在我的设备上使用此代码启用了 Jersey 日志记录ApplicationJAXRS extends Application Override public Set
  • 为什么使用 Atlassian Crowd [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想了解 Atlassian 人群通过 LDAP 服务器做什么 看起来大多数 Atlassian 产品都允许您指向 Atlassian 服务器进行授权
  • 停止quartz调试日志记录log4j

    我一直试图关闭令人讨厌的石英调试日志记录 我正在使用 log4j 作为日志记录框架 并且我已经尝试将此行添加到 lg4j 属性文件中 log4j logger org quartz ERROR 我仍然收到大量这些调试日志消息 13 35 4
  • Android 联系人 RAW_CONTACT_ID 与 CONTACT_ID

    我正在使用联系人选择器 如下所示 Intent contactPickerIntent new Intent Intent ACTION PICK Contacts CONTENT URI startActivityForResult co
  • 将多个 PNG 制作成一个 ICO 文件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 使用 Windows ICO 文件 您可以将多个不同大小的图像打包到同一个 ICO 文件中 然后 Win
  • 多风格设置中的 Android Gradle 1.0 计算版本代码

    计算不同产品风格的版本代码的代码不再在 Android Gradle 1 0 系统中运行 我之前成功地使用了下面的示例代码 http tools android com tech docs new build system tips TOC
  • 如何从 .m 文件创建可执行的 .exe 文件

    我想知道是否有一种方法可以在 MATLAB 中从 m 文件创建 exe 文件 这样它就可以在没有 MATLAB 的机器上运行 就像可以在 C C 中完成一样 我知道编写 MATLAB 函数是一种方法 但我不确定它是否可以在没有 MATLAB
  • JavaScript inflate 实现(可能仅限 FF 3.6)

    我正在编写一些在 FireFox 3 6 中使用 HTML 5 文件 API 的脚本 我有一些放气 压缩 的文件 我需要对它们进行充气 解压缩 我找到了一个few http www codeproject com KB scripting
  • 英特尔 XDK 中的 res/drawable 文件

    xdk中有没有办法将文件传输到android res drawable文件夹 我有以下文件 src android drawable noti icon png www src android drawable noti icon png
  • 长时间关闭时如何处理servlet请求

    我们需要在 Servlet 应用程序中实现优雅的关闭机制 编辑 我们希望使其尽可能简单 这将处理通过操作系统功能发送的终止信号 这将允许系统管理员使用内置的 shell 实用程序 Windows 上的kill 或taskkill 否则他们必
  • 反应本机保存屏幕到图像问题(react-native-view-shot 模块)

    我想得到反应本机视图镜头 https github com gre react native view shot工作 但我认为模块和我安装的 React Native 工具版本存在某种不兼容性 这阻碍了我的工作 核心问题似乎在于这段代码 i
  • 如何配置 OpenSL 来录制语音通话

    我正在使用 MediaRecorder 开发通话录音应用程序语音通话音频源 在某些棉花糖设备中它崩溃了 然后我将源更改为MIC这里传入的声音没有被记录 由于java的限制 现在我正在研究原生android代码来录制语音通话 我设法使用录制音
  • python 不被识别为内部或外部命令[重复]

    这个问题在这里已经有答案了 我尝试安装this https github com joyent node wiki Installation软件 为此需要Python 我从以下位置安装了Pythonhere http python org
  • PHP 中的随机 ID/数字生成器

    我正在我的数据库中构建一个 代理 ID 列表 满足以下要求 ID 长度必须为 9 位 仅限数字 ID 中的相同数字不得超过 3 个 ID 不能包含超过 2 个连续的相同数字 即 887766551 不能有 888 到目前为止 我已经完成了第
  • 在 Python 中将数据添加到嵌套列表

    我有一个嵌套列表 例如 nlist 1 2 3 4 5 6 7 8 9 在将此列表插入数据库之前 我想向其中添加一个 列 并在新列的每一行中具有相同的值 例如 nlist a 1 2 3 a 4 5 6 a 7 8 9 例如 当原始嵌套列表
  • MVC 4 Web API 帖子

    我想从远程客户端进行插入 因为我需要通过 http 发送数据 我可以使用getPerformances 正确地与httpClient api performances date 0 我想问一下我的postPorformances 我内部的实
  • ProcessBuilder 和 Runtime.exec() 之间的区别

    我正在尝试从 java 代码执行外部命令 但我注意到两者之间存在差异Runtime getRuntime exec and new ProcessBuilder start 使用时Runtime Process p Runtime getR
  • Linux/C++ 如何调试发布应用程序

    我有 linux c 多线程应用程序 现在它已经在生产服务器上进行了测试并且出现了段错误 问题是我无法在任何测试服务器上重现该错误 并且无法访问生产服务器 我没有转储或任何其他有用的信息 仅行 段错误位于 0000000046bf0fb8
  • JTree,始终以“编辑模式”显示所有节点

    我正在显示自定义对象树 并且我有自定义对象CellTreeEditor and CellTreeRenderer set 现在我真正想要的是始终像 编辑模式 一样显示所有对象 现在我有CellTreeRenderer getTreeCell
  • 姜戈/彗星(推):万恶之中最小的?

    我已阅读了我能找到的所有有关 Django 和 HTTP Push 的问题和答案 然而 没有人提供一个清晰 简洁 从头到尾的解决方案来说明如何实现所谓的 comet 功能的基本 hello world 第一个问题 1 HTTP 的问题在多大