如何将Nodejs和XMPP与我的现有Web应用程序集成以实现聊天功能?

18

我读了很多关于这个问题的问答,但是都没有令人满意的答案。

现有应用

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

我想要集成的功能

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

  • 点对点消息
  • 在线状态和最后一次出现时间
  • 群组聊天
  • 阅读回执

我从类似问题中得到的基本想法。

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

问题

  1. 如何在这里集成聊天?
  2. 如何验证XMPP用户(FYI,我当前已实现JWT身份验证)?
  3. 建议使用redis(发布/订阅)与socket.io或mqtt(发布/订阅)来实现聊天。它是否可扩展?/性能如何?

我问的可能太广泛了。但仍然没有任何关于使用哪些技术集的想法。


这个问题涉及面过于广泛,但由于您添加了悬赏,我无法投票将其关闭。基本上,您在这里所需要的将需要支付顾问来为您完成。 - hardillb
@hardillb:我没有经营公司来支付咨询费用。只是出于学习目的在问。不可能一下子就学会所有东西,需要时间。所以只是在问最好的方法是什么。 - Vishwasraj
@vishwasraj: 你找到解决方案了吗?最终你使用了哪个客户端库/框架? - TruckDriver
3个回答

1

为了学习目的,您可以使用ejabberd+converse.js实现所有事情。以下步骤将在Ubuntu中设置环境。

  1. setup ejabberd by following https://www.digitalocean.com/community/tutorials/how-to-install-ejabberd-xmpp-server-on-ubuntu
  2. create a host binding by editing /etc/hosts file in ubuntu

    127.0.1.2       talk.rajesh6115.local
    
  3. install apache2 using

    sudo apt-get update
    sudo apt-get install apache2
    
  4. setup a virtual host for bosh (XEP-0206) in your apache like below /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. now you can configure converse js to point to your bosh service, then your communications starts

注意:

通过添加以下行来在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(简单):使用相同的登录名用于Web应用程序和XMPP,例如rajesh@talk.rajesh6115.local既可以是电子邮件地址,也是有效的JID。

方法2:使用身份验证服务器,在成功验证后返回JID和密码,然后使用提供的凭据启动您的XMPP会话。


0

根据您最初的解决方案,我建议您查看node-xmpp-clientnode-xmpp-server

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

当然,您可以像prosody或ejabberd这样使用现有服务器作为聊天的后端。根据我的经验,将node-xmpp-client集成起来并不需要太多工作。但是,构建/运行一个能够实际与其他服务器通信的XMPP服务器并不那么简单-比抛在一起的示例要复杂一些,不幸的是。

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

所以

如果您担心性能问题,不需要 XMPP 本身,而只是想要上述功能,那么选择 XMPP 是一个糟糕的选择。它对于您最初的目的来说太浪费了。

因此,像 zmq 这样的东西应该可以让您实现群组和个人聊天。

Redis 可以用于保存聊天历史记录、在线状态信息和消息接收确认。

据我所知,没有适用于 Node 的库可以免费提供您想要的内容,而且在我看来,使用 XMPP 的方式甚至比自己使用类似 zmq 和数据存储作为后端工具实现您的功能更加困难。


0

我建议使用socket.io,因为您目前正在使用JWT身份验证,并且可以使用NodeJS实现身份验证。您可以在socket.io中创建所谓的房间,用于点对点消息或群聊。我看了你的评论,既然是为了学习目的,Mysql足够可扩展。为了性能起见,使用像nginx这样的负载均衡器,甚至可以使用具有水平扩展技术的NodeJS负载均衡器轻松扩展性能。希望它有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接