【问题标题】:How do I integrate chat with nodejs and xmpp into my existing web application?如何将聊天与 nodejs 和 xmpp 集成到我现有的 Web 应用程序中?
【发布时间】:2015-11-23 19:44:46
【问题描述】:

我已经阅读了很多与此相关的问题,但没有一个是令人满意的。

现有应用

使用 Expressjs 实现的极简社交网络 API.使用 MySql 作为 DB。socket.io 用于通知和 ember.js 作为前端框架。

我想要整合的东西

我只想实现 XMPP 的一些功能,例如

  • 对等 2 对等消息传递
  • 存在和最后一次看到
  • 群聊
  • 阅读回执

我从阅读类似问题中得到的一个基本想法。

  1. 需要一个客户端库(Strophe.js、Converse.js)
  2. 需要 XMPP 服务器(ejabberd、Openfire、Prosody)

问题

  1. 如何在此处集成聊天功能?
  2. 如何对 XMPP 用户进行身份验证(仅供参考,我目前已实施 JWT 身份验证)?
  3. 关于使用 redis(pub/sub) 和 socket.io 或 mqtt pub/sub 来实现聊天的建议。它是否可扩展? / 性能呢?

我问的可能太宽泛了。但仍然不知道使用哪种技术。

【问题讨论】:

  • 这个问题太宽泛了,但是由于您添加了赏金,我无法投票关闭它。您基本上在这里寻找的东西需要支付顾问费用来为您完成
  • @hardillb:经营一家公司不是为了提供咨询服务。只是出于学习目的。不能一次性学习所有这些。需要时间。所以只是问最好的方法。跨度>
  • @vishwasraj :您找到任何解决方案了吗?你最后使用了什么客户端库/框架?

标签: node.js redis xmpp mqtt


【解决方案1】:

我建议使用 socket.io,因为您当前正在使用 JWT 身份验证,它可以使用 NodeJS 实现身份验证。您可以在 socket.io 中创建呼叫室,用于点对点消息传递或群聊。我阅读了您的评论,因为它是出于学习目的,所以 Mysql 具有足够的可扩展性。为了性能,使用像 nginx 这样的负载均衡器,甚至可以使用带有水平扩展技术的 NodeJS 负载均衡器,可以轻松扩展性能。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    出于学习目的,您可以使用 ejabberd+converse.js 实现所有目标 以下步骤将在 ubuntu 中设置环境

    1. 按照https://www.digitalocean.com/community/tutorials/how-to-install-ejabberd-xmpp-server-on-ubuntu设置ejabberd
    2. 通过在 ubuntu 中编辑 /etc/hosts 文件来创建主机绑定

      127.0.1.2       talk.rajesh6115.local
      
    3. 使用

      安装 apache2
      sudo apt-get update
      sudo apt-get install apache2
      
    4. 在你的 apache 中为 bosh (XEP-0206) 设置一个虚拟主机,如下所示 /etc/apache2/sites-available/talk.rajesh6115.local.conf

      <VirtualHost *:80>
          ServerName talk.rajesh6115.local
          ServerAlias www.talk.rajesh6115.local
          ServerAdmin webmaster@talk.rajesh6115.local
          DocumentRoot /var/www/talk.rajesh6115.local
          ErrorLog ${APACHE_LOG_DIR}/error.log
          CustomLog ${APACHE_LOG_DIR}/access.log combined
          ProxyPass /http-bind http://talk.rajesh6115.local:5280/http-bind/
          ProxyPassReverse /http-bind http://talk.rajesh6115.local:5280/http-bind/
      </VirtualHost>
      
    5. 现在您可以将 converse js 配置为指向您的 bosh 服务,然后您的通信开始

    注意:

    通过添加如下行在 ejabberd 中设置虚拟主机

        hosts:
          - "talk.rajesh6115.local"
    

    设置管理员登录。使用此登录您可以创建用户。

      admin:
         user:
             - "admin": "talk.rajesh6115.local"
    
    1. 为了让 conversejs 与 xmpp 服务器对话,您只需提供一件事,那就是 bosh 服务 url。更多细节 https://conversejs.org/docs/html/development.html#initialize

    7.最后如何与web应用集成?

    方法1(简单): 对 webapp 和 xmpp 使用相同的登录名意味着 rajesh@talk.rajesh6115.local 可以是电子邮件地址,也可以是有效的 jid

    方法二: 使用身份验证服务器,成功身份验证后将返回 jid 和密码,然后使用提供的凭据启动 xmpp 会话。

    【讨论】:

      【解决方案3】:

      鉴于你最初的想法如何解决这个问题,我建议你看看node-xmpp-clientnode-xmpp-server

      这是一组优秀的库,您可以使用它们在 nodejs 级别上完全集成您的应用程序。因此,您可以自己控制身份验证(在您的应用中使用现有用户/密码?),并在(群)聊天中出现消息时收到通知。

      当然,您可以使用现有服务器(如 prosody 或 ejabberd)作为聊天的后端。根据我的经验,集成 node-xmpp-client 并没有太多工作。但是使用 nodejs 构建/运行 XMPP 服务器(实际上可以与其他服务器通信)并不是那么简单 - 不幸的是,这些例子比这些例子产生的要多一点。

      此外,XMPP 是基于文本的,实际上更糟糕的是,基于 xml……这并不是高效的定义。更不用说所有支持 node-xmpp 的模块的复杂性了 :)

      所以

      如果您担心性能并且本身不需要 XMPP 并且真的只想要上述功能,那么 XMPP 是一个糟糕的选择。对于您的原始目的而言,这太浪费了。

      因此,zmq 之类的内容应该可以让您实现群组和个人聊天。

      redis 可用于保存聊天历史记录、在线状态信息和消息回执。

      据我所知,没有任何 node 库可以免费为您提供所需的东西,恕我直言,使用 XMPP 的方式比使用 zmq 和数据存储等工具实现您的功能更加困难。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-19
        • 2012-11-10
        • 2011-07-13
        • 1970-01-01
        • 2016-04-03
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多