我写了几个Android和iOS原生移动应用程序,它直接连接到我托管的XMPP服务器。他们通过XMPP推送和提取实时数据。我也使用了一些XMPP XEP extensions。对于其他操作,我在同一服务器上运行django应用程序,所有移动应用程序都通过HTTP REST接口使用该服务器。我使用Celery和Redis为django方面异步执行某些操作(比如对我的数据库进行大量的批量写入)。
这一切都很好,花花公子。耶。
但是现在我想为所有这些写一个网络前端,所以我开始研究我的选择并且很好 - 有很多方法可以让那些我想先与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库,我认为它不具备闪回后备功能。另外,我需要研究这对我的服务器意味着什么。
我已经阅读了关于如何做彗星和django的几个Stackoverflow答案 - 因此为什么看起来有几种选择。
问题是:
如果我想利用Socket IO行为的优势(带回退),我想将实时数据推送到Web客户端(通过XMPP送到服务器),并使用Django是什么我最好的选择?
更新:我使用的XMPP服务器是ejabberd,它也支持BOSH。我意识到我可以使用Strophe.js,因此我的通信将通过一种长轮询http连接而不是websockets。据我所知,有一些XMPP over Websockets open source library,但AFAIK社区不像SocketIO那样活跃。
更新2:我需要支持的浏览器只是现代浏览器。我想这意味着Flash后备不会那么重要,这让我倾向于strophe.js。
答案 0 :(得分:8)
我认为一旦你弄清楚某个节点,你就会发现从socket for stra.io中stra is会变得更加困难。节点中有非常容易使用的xmpp模块(参见https://github.com/astro/node-xmpp)。请记住,节点都是javascript,所以你可能已经熟悉它中的编程了。
就个人而言,我使用节点0.6或更高版本时遇到了一些内存泄漏问题。 Node 0.4没有遇到这些问题。如果你是github的新手(就像我在使用Node之前那样),这里是你如何使用节点服务器。
获取节点
您需要某些开发工具来构建它,例如g ++,但此时您将拥有一个有效的node
命令。
安装xmpp等节点模块
Node拥有大量模块,其中大部分内容已经为您编写。在http://search.npmjs.org有一个搜索工具,或者您可以使用npm
命令直接从shell访问所有模块。 NPM是用于安装和管理节点模块的节点工具。例如,您可以键入npm search xmpp
来搜索所有xmpp模块。要为节点安装基本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)所付出的代价。您可以键入npm install forever -g
以永久安装。请注意-g选项,它永远放在GLOBAL节点模块目录中。如果没有-g,它会将节点模块放在当前工作目录中。然后你就可以键入类似的东西(假设你的节点程序名为my_program.js)forever start my_program.js
然后Forever程序将确保如果它死了就会重新启动。
答案 1 :(得分:5)
如果你打算做BOSH(XEP-0124,XEP-0206),那就不知道为什么你需要Flash后备,这就是strophe.js的作用。如果你不需要支持IE7,你可以从strophe.js做CORS,你甚至不需要同源的代理。 IE6会起作用,因为它不安全,IE8 +支持一种刚刚工作的CORS形式。
要从django通过XMPP向您的客户端获取信息,请使用您最喜欢的XEP-0114(例如来自Django应用的Python XMPP library)与您的服务器建立组件连接(SleekXMPP)。为了性能(即不为每个客户端连接创建新连接),安排该连接相对长寿。根据需要发送协议。
您没有提到您正在使用的XMPP服务器。不支持BOSH的XMPP服务器变得越来越少,但是如果你有一个,你可能需要Punjab作为BOSH到XMPP代理,或者你可能想要切换到更新的{{3} },例如server。
答案 2 :(得分:4)
首先,完全披露:我在一家名为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,您可以使用它而不是我们的vanilla JavaScript api,并且仍然会在大约10行代码中绑定到您的Django后端。
最后,使用IaaS(或者至少是我们;我不确定其他人)的好处是我们会为您处理棘手的扩展问题。如果你达到了一百万个并发用户并且需要实时向他们推送内容,你会发现这没问题。
答案 3 :(得分:2)
我们正在使用Django和Celery进行实时推送。当我第一次创建架构时,我也研究了我的选择。最终,我决定我更专注于让应用程序恰到好处而不是随意摆弄devops工作。有几种服务可以提供托管的实时推送技术,可以轻松地与任何应用程序集成。
我选择了PubNub,我感到非常高兴。它们支持客户端的socket.io,并且有一个我从Django和Celery worker使用的Python库。他们还有可以在原生移动应用中使用的SDK。
我知道,你已经有了适当的设置。但我敢打赌,用这种托管解决方案替换当前设置所花费的时间将少于您为所寻找和实现的目标找到一个好的解决方案所需的时间。还要记住维护成本(特别是如果你选择了一个维护得不好的lib)。
是的,你将为这项服务付费,但是它们的价格是非常合理的,你将得到一个可靠的服务,如托管等好处。
我不是那家公司的附属公司,只是一个快乐的客户。有other similar services out there。