如何将与nodejs和xmpp的聊天集成到我现有的Web应用程序中?

时间:2015-08-29 05:33:04

标签: node.js redis xmpp mqtt

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

现有应用

  

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

我要整合的内容

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

  
      
  • Peer 2 Peer Messaging
  •   
  • 在场和上次见到
  •   
  • 群聊
  •   
  • 阅读回执
  •   

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

  
      
  1. 需要客户端库(Strophe.js,Converse.js)
  2.   
  3. 需要XMPP服务器(ejabberd,Openfire,Prosody)
  4.   

问题

  1. 如何在此处集成聊天功能?
  2. 如何验证XMPP用户(仅供参考,我目前已实施JWT身份验证)?
  3. 使用redis(pub / sub)与socket.io或mqtt pub / sub实现聊天的建议。它是否可扩展? /表现怎么样?
  4.   

    我问的问题可能过于广泛。但仍然不知道如何使用哪种技术。

3 个答案:

答案 0 :(得分:1)

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

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

    127.0.1.2       talk.rajesh6115.local
    
  4. 使用

    安装apache2
    sudo apt-get update
    sudo apt-get install apache2
    
  5. 在您的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>
    
  6. 现在您可以将converse js配置为指向您的bosh服务,然后开始通信

  7. 注:

    通过添加如下所示的行

    在ejabberd中设置虚拟主机
        hosts:
          - "talk.rajesh6115.local"
    

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

      admin:
         user:
             - "admin": "talk.rajesh6115.local"
    
    1. for make conversejs与xmpp服务器交谈只需要提供一件事就是bosh serivce url。更多细节 https://conversejs.org/docs/html/development.html#initialize
    2. 7.最终如何与Web应用程序集成?

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

鉴于您最初的想法如何解决此问题,我建议您查看node-xmpp-clientnode-xmpp-server

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

当然,您可以使用现有服务器(如韵文或ejabberd)作为聊天的后端。根据我的经验,将node-xmpp-client集成在一起并不多。但是构建/运行带有nodejs的XMPP服务器(实际上可以与其他服务器通信)并不是那么简单 - 不幸的是,抛出的示例会产生更多的结果。

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

<强>因此

如果您担心性能并且不需要XMPP本身,并且实际上只需要上述功能,则XMPP是错误选项。这对你的原始目的来说太浪费了。

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

redis可用于保存聊天记录,状态信息和消息接收。

据我所知,没有一个节点库可以免费提供你想要的东西,而恕我直言,使用XMPP的方式比使用zmq和数据存储区等工具实现你自己的功能更难。< / p>