实时服务器推送与插座10(或Strophe.js),XMPP和Django的(Realtime se

2019-07-29 04:28发布

我有一对夫妇Android和iOS,我写这直接连接到XMPP服务器,我的主机本地移动应用程序。 他们推动并通过XMPP拉实时数据。 我也用了一些的XMPP XEP扩展 。 对于其他操作,我有所有的移动应用程序通过HTTP REST接口消耗同一台服务器上运行的Django应用程序。 我用芹菜和Redis的用于Django的侧异步做一些操作(如从事繁重的批量写入我的分贝)。

这一切工作正常,很正常。 好极了。

但现在我想写一个web前端这一切,所以我开始研究我的选择和好 - 有这么多的方法对皮肤,我想先用SO社区检查猫。

这个想法有一个js库,让我对socket通信统一的API(即尝试网络插座的不同实现或回落到闪存)为什么我提的Socket IO因此吸引了我。 不必运行服务器的NodeJS,好了,没有那么多的(还有一两件事要学会)的想法,但如果我有,我一定会的。 我知道有些人使用GEVENT作为替代节点服务器 。 其他人,决定写他们连接到他们的堆栈的其他小的NodeJS 。 我可能会做到这一点。

另一种选择是使用一个JS XMPP库一样的strophe ,我不认为有闪光灯回退。 另外,我需要研究这是什么意思我的服务器。

我已看过一些关于如何做到彗星和Django中的#1的答案 - 因此为什么它似乎有多种选择。

问题是:

如果我想有插座IO行为(与回退)的优势,我想实时数据推到Web客户端(正通过XMPP输送到服务器),并使用Django的是我最好的选择?

更新:我使用的XMPP服务器是ejabberd ,同时也支持BOSH 。 我意识到,我可以用Strophe.js ,因此我的沟通会超出一型长轮询HTTP连接,而不是支持WebSockets。 据我所知,有一些超过WebSockets的开源库XMPP ,但据我所知社会并不像活跃的SocketIO之一。

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

Answer 1:

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

要通过XMPP得到Django的信息到客户端,使一个组件连接( XEP-0114使用自己喜欢的)到你的服务器的Python XMPP库 ,如SleekXMPP从您的Django应用程序。 安排这方面是相对长寿命,性能(即没有为每个客户端连接一个新的)。 根据需要发送的协议。

你没有提到你正在使用的XMPP服务器。 不支持XMPP BOSH服务器越来越少见,但如果你有一个,你可能需要旁遮普作为BOSH对XMPP代理,或者您可能需要切换到一个新的服务器 ,如韵律 。



Answer 2:

我认为一旦你得到你的手脏一些节点,你会发现,从节点偏离了socket.io将是更难。 有很容易在节点准备去(见使用XMPP模块https://github.com/astro/node-xmpp )。 请记住,节点是所有的JavaScript,所以你可能熟悉它已经编程。

就个人而言,我已经使用节点0.6或更高一些内存泄漏问题。 节点0.4工作没有这些问题。 如果你是新来的github(因为我是用节点播放前)这里是如何,你会得到一个节点服务器去。

获取节点

  1. 登录到你的Linux机器和喜爱的目录(我假设/)
  2. 混帐克隆https://github.com/joyent/node.git
  3. CD /节点
  4. git的标签-l(这将列出节点的所有可用的版本)
  5. git的结帐v0.6.16(这将签0.6.16版本的节点,你可以替换成v0.4.12例如,如果您有内存问题)
  6. 。/配置
  7. 使
  8. 使安装

你需要一定的开发工具来构建它,如G ++,但在这一点上,你将有一个工作node命令。

安装节点模块像XMPP

Node有大部分的东西已经为你写的模块的一个很好的量。 有一个在搜索工具http://search.npmjs.org或者你可以从你的shell通过直接访问所有模块npm命令。 NPM是用于安装和管理节点模块节点的工具。 您可以键入npm search xmpp搜索所有XMPP模块,例如。 要为节点,你会做安装一个基本的XMPP库npm install node-xmpp 。 顺便说一句,最GitHub的节点模块的网页将包括头版自述文件的说明。

保持节点运行在生产

这把我当我第一次开始了。 如果您有没有被卡住节点都将会死于任何错误。 所以,你可以1.确保有没有任何错误或他们都抓住了(不可能的,因为即使节点本身会报错)2.使用uncaughtException处理程序来捕获这些问题。 你会在你的程序中使用这样的代码

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

});

要格外安全和永久使用

即使在uncaughtException问题的生产程序可能会死。 内存不多了,段错误,谁知道是什么。 这就是它支付使用类似所谓的“永远”(见的精彩节点模块https://github.com/nodejitsu/forever )。 您可以键入npm install forever -g永远安装。 注意这使永远在GLOBAL节点模块目录-g选项。 如果没有-g,它把节点模块中的当前工作目录。 然后,您就可以输入像(假设你的节点计划被称为my_program.js) forever start my_program.js ,然后永远的计划将确保如果死它被重新启动。



Answer 3:

首先,充分披露:我在一家叫PubNub公司,我会很快提工作。

这里有一系列的托管双向信息服务(有时被称为的IaaS - 基础设施即服务),我认为是值得考虑的。 他们是推,火力地堡,Flotype,PubNub,等等。 我有理由相信,你可以使用其中的任何您想要完成的任务。 火力地堡有一个内置的数据库关系,直至他们的服务,这是一个很酷的功能,但可能不是你的特定用例有用的(我假设你已经在你的后台数据库)。

我不能说得太严重了解我们的竞争对手,但只要你想对你的Python后端通信的前端JavaScript库,我们(PubNub)提供两种语言非常类似的API ,并在同一个数据总线的通信的云端。 所以,你可以使用Python发送消息和使用JavaScript,或者反之亦然抓住他们。 我们甚至写了一socket.io的PubNub托管版本 ,您可以使用,而不是我们的香草的JavaScript API,并且仍然会扎入你的Django后端约10行代码。

最后,有关使用的IaaS(或者至少我们;再次,我不能确定其他人)的好处是,我们处理这个棘手的结垢问题给你。 如果达到一百万用户同时使用的点,需要在实时推送的东西给他们,你会发现这是没有问题的。



Answer 4:

我们使用的实时推送以及使用Django和芹菜。 当我第一次创建的架构,我还研究了我的选择。 最终,我决定,我宁愿专注于获得应用恰到好处而不是与DEVOPS变通摆弄。 有几种服务,有可以与任何应用都可以很容易地集成是提供主机实时推送技术。

我选择了PubNub ,我不能快乐。 他们支持的客户端socket.io,并有一个Python的lib我从Django和芹菜工作者使用。 他们也有,你可以从本地移动应用使用的SDK。

我知道,你已经有一个适当的工作设置。 但我打赌的时候它会带你这样的托管解决方案,以取代当前设置会低于它会带你找到你要找的一个很好的解决方案,并实现它的时间。 同时请记住保养费用在路上(尤其如果你选择它不能很好地保持了LIB)。

的确,你将支付服务,但他们的价格是非常合理的,你会得到漂亮津贴像托管了坚实的服务。

我不跟那家公司,只是一个快乐的客户关联。 还有其他类似的服务在那里 。



文章来源: Realtime server push with Socket IO (or Strophe.js), XMPP and Django