【问题标题】:Realtime server push with Socket IO (or Strophe.js), XMPP and Django使用 Socket IO(或 Strophe.js)、XMPP 和 Django 进行实时服务器推送
【发布时间】:2012-05-08 18:37:44
【问题描述】:

我编写了几个 Android 和 iOS 原生移动应用程序,它们直接连接到我托管的 XMPP 服务器。他们通过 XMPP 推送和拉取实时数据。我还使用了一些XMPP XEP extensions。对于其他操作,我在同一台服务器上运行了一个 django 应用程序,所有移动应用程序都通过 HTTP REST 接口使用它。我在 django 端使用 Celery 和 Redis 来异步执行一些操作(比如对我的数据库进行大量的批量写入)。

这一切都很好而且花花公子。耶。

但现在我想为所有这些编写一个 Web 前端,所以我开始研究我的选择,而且很好 - 有很多方法可以给猫剥皮,我想先咨询 SO 社区。

拥有一个 js 库的想法为我提供了用于套接字通信的统一 API(即尝试不同的 Web 套接字实现或回退到 Flash)对我很有吸引力,因此我提到了 Socket IO。必须运行 nodejs 服务器的想法,好吧,不是那么多(还要学习一件事),但如果我必须这样做,我肯定会。我知道有些人使用gevent as a replacement of the node server。其他人,决定写一个small nodejs which they connect to the rest of their stack。我可能会这样做。

另一种选择是使用像 Strophe 这样的 js XMPP 库,我认为它没有 Flash 回退。另外,我需要研究这对我的服务器意味着什么。

我已经阅读了一些 Stackoverflow 上关于如何做 comet 和 django 的答案 - 因此似乎有几个选项。

问题是:

如果我想获得 Socket IO 行为的优势(带有回退功能),并且我想将实时数据推送到 Web 客户端(通过 XMPP 馈送到服务器),并使用 Django 什么是我的最佳选择?

更新:我使用的XMPP服务器是ejabberd,也支持BOSH。我意识到我可以使用Strophe.js,因此我的通信将通过一种长轮询http连接而不是websockets。据我所知,有一些 XMPP over Websockets open source library,但 AFAIK 社区不如 SocketIO 活跃。

更新 2: 我需要支持的浏览器只是现代浏览器。我想这意味着 Flash 后备不会那么重要,这让我倾向于 strophe.js。

【问题讨论】:

  • 除了js之外还有其他语言的socket.io服务器实现。节点只是参考服务器。我有一个使用 Go 编写的 go-socket.io 的 socket.io 服务器。 Python 有 TornadIO2,它在其堆栈中使用 tornado。

标签: django xmpp socket.io comet strophe


【解决方案1】:

我认为,一旦您开始使用某个节点,您会发现从 Node 转向 socket.io 会变得更加困难。在 node 中有非常容易使用的 xmpp 模块(参见https://github.com/astro/node-xmpp)。请记住,node 都是 javascript,所以您可能已经熟悉使用它进行编程了。

就我个人而言,我在使用节点 0.6 或更高版本时遇到了一些内存泄漏问题。 Node 0.4 没有这些问题。如果您是 github 新手(就像我在玩 Node 之前一样),那么您将如何使用节点服务器。

获取节点

  1. 登录到你的 linux 机器和最喜欢的目录(我假设 /)
  2. git 克隆https://github.com/joyent/node.git
  3. cd /节点
  4. git tag -l(这将列出所有可用的节点版本)
  5. git checkout v0.6.16(这将检查节点的 0.6.16 版本,例如,如果您有内存问题,可以将其替换为 v0.4.12)
  6. ./配置
  7. 制作
  8. 进行安装

您需要某些开发工具来构建它,例如 g++,但此时您将拥有一个有效的 node 命令。

安装 xmpp 等节点模块

Node 有大量的模块,其中大部分内容已经为您编写好了。 http://search.npmjs.org 有一个搜索工具,或者您可以使用 npm 命令直接从您的 shell 访问所有模块。 NPM 是用于安装和管理节点模块的节点工具。例如,您可以键入 npm search xmpp 来搜索所有 xmpp 模块。要为 node 安装一个基本的 xmpp 库,你会做npm install node-xmpp。顺便说一句,大多数 github 节点模块页面都会在首页自述文件中包含说明。

保持节点在生产环境中运行

当我刚开始时,这让我很震惊。如果您有任何未捕获的错误,节点将简单地死掉。所以,你可以 1.确保没有任何错误或者它们都被捕获(不太可能因为即使是Node本身也会出错) 2. 使用 uncaughtException 处理程序来捕获这些问题。你会在你的程序中使用这样的代码

process.addListener("uncaughtException", function (err) {
    util.log("Uncaught exception: " + err);
    console.log(err.stack);
    console.log(typeof(this));
    // maybe email me?

});

更加安全并永远使用

即使出现 uncaughtException 问题,您的生产程序也可能会死掉。内存耗尽,段错误,谁知道呢。这就是使用名为“Forever”(参见https://github.com/nodejitsu/forever)的精彩Node 模块之类的东西的地方。您可以输入npm install forever -g 永久安装。注意 -g 选项,它永远放在 GLOBAL 节点模块目录中。如果没有 -g,它会将节点模块放在当前工作目录中。然后,您可以输入类似(假设您的节点程序称为 my_program.js)forever start my_program.js 之类的内容,然后 Forever 程序将确保如果它死了,它会重新启动。

【讨论】:

    【解决方案2】:

    首先,全面披露:我在一家名为 PubNub 的公司工作,我稍后会提到。

    我认为有一系列值得考虑的托管双向消息传递服务(有时称为 IaaS - 基础设施即服务)。它们是 Pusher、Firebase、Flotype、PubNub 等。我有理由相信你可以使用它们中的任何一个来完成你想要完成的事情。 Firebase 有一个与他们的服务直接相关的内置数据库,这是一个非常酷的功能,但对于您的特定用例可能没有用(我假设您的后端已经有一个数据库)。

    我不能过多谈论我们的竞争对手,但就您希望在前端有一个与您的 Python 后端通信的 JavaScript 库而言,我们 (PubNub) 提供 a very similar api in both languages 并在同一数据总线上通信云。因此,您可以使用 Python 发送消息并使用 JavaScript 捕获它们,反之亦然。我们甚至写了一个PubNub-hosted version of socket.io,您可以使用它来代替我们的原生 JavaScript api,并且仍然可以在大约 10 行代码中绑定到您的 Django 后端。

    最后,使用 IaaS(或者至少是我们;我不确定其他人)的好处是我们为您处理了那个棘手的扩展问题。如果您达到一百万同时用户的程度,并且需要实时向他们推送某些内容,您会发现这没问题。

    【讨论】:

      【解决方案3】:

      我们也在 Django 和 Celery 中使用实时推送。当我第一次创建架构时,我还研究了我的选择。最终,我决定我宁愿专注于让应用程序恰到好处,而不是摆弄 devops 工作。有几种服务提供托管实时推送技术,可以轻松与任何应用程序集成。

      我选择了PubNub,我非常高兴。他们支持客户端的 socket.io,并有一个我从 Django 和 Celery 工作人员使用的 Python 库。他们还拥有可以从原生移动应用程序使用的 SDK。

      我知道,您已经有了一个工作设置。但我敢打赌,您用这种托管解决方案替换当前设置所花费的时间将少于您为正在寻找的解决方案找到并实施它所花费的时间。还要记住以后的维护成本(尤其是如果您选择了维护不善的库)。

      的确,您会为服务付费,但它们的价格非常合理,而且您将获得可靠的服务以及托管等不错的福利。

      我不隶属于那家公司,只是一个快乐的客户。有other similar services out there

      【讨论】:

      • 问题是每个客户端都可能每秒推送 1 个消息,并且最多也可以每秒获得 1 个消息(只有当我缓冲、优化和压缩来自服务器端的消息时)进入 1)。由于这将是我基础架构的关键部分,我宁愿不将其外包给另一家公司。不过,您对 quora 问题的链接提供了几个自托管选项的链接。谢谢!
      【解决方案4】:

      如果你打算做 BOSH (XEP-0124, XEP-0206),不知道为什么需要 Flash 后备,这就是 strophe.js 所做的。如果你不需要支持 IE7,你可以从 strophe.js 做CORS,你甚至不需要同源代理。 IE6 可以正常工作,因为它不安全,而 IE8+ 支持刚刚勉强工作的 CORS 形式。

      要通过 XMPP 从 django 获取信息到您的客户端,请使用您最喜欢的 Python XMPP library(例如 Django 应用程序中的 SleekXMPP)与您的服务器建立组件连接 (XEP-0114)。为了性能,安排该连接的寿命相对较长(即不要为每个客户端连接创建一个新连接)。根据需要发送协议。

      您没有提及您使用的 XMPP 服务器。不支持 BOSH 的 XMPP 服务器越来越少,但如果您有,您可能需要 Punjab 作为 BOSH 到 XMPP 代理,或者您可能想要切换到更新的 server,例如Prosody.

      【讨论】:

      • 我正在使用已经支持 BOSH 的 ejabberd,所以我想我不需要代理。我不需要支持 IE6-IE7,如果我也将 IE8 排除在外,这是我的选择。
      猜你喜欢
      • 2012-05-23
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2014-07-11
      相关资源
      最近更新 更多