11

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

这一切都很好,花花公子。耶。

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

拥有一个 js 库,它为我提供了一个用于套接字通信的统一 API(即尝试不同的 Web 套接字实现或回退到 Flash)的想法吸引了我,因此我提到了 Socket IO。必须运行 nodejs 服务器的想法,好吧,不是那么多(还要学习一件事),但如果我必须这样做,我肯定会。我知道有些人使用gevent 作为节点服务器的替代品。其他人,决定编写一个小的 nodejs,将其连接到堆栈的其余部分。我可能会这样做。

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

我已经阅读了几个关于如何做彗星和 django 的 Stackoverflow 答案——因此为什么看起来有几个选项。

问题是:

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

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

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

4

4 回答 4

8

我认为一旦你开始使用某个节点,你会发现从 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 程序将确保如果它死了,它会重新启动。

于 2012-05-01T00:52:33.493 回答
5

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

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

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

于 2012-04-30T08:08:46.170 回答
4

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

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

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

Finally, the nice thing about using an IaaS (or at least us; again I'm not certain about the others) is that we handle that tricky scaling problem for you. If you reach the point of a million simultaneous users and need to push something to them in real-time, you'll find that's no problem.

于 2012-05-01T19:50:14.880 回答
2

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

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

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

诚然,您将为服务付费,但它们的价格非常合理,您将获得可靠的服务以及托管等优惠。

我不隶属于那家公司,只是一个快乐的客户。还有其他类似的服务

于 2012-05-01T09:03:29.327 回答