ejabberd 对比 socket.io+redis 的优势

benetfits of ejabberd versus socket.io+redis

我正在开发一项 Web 服务,我们预计该服务很快就会大规模扩展。该服务现在使用 socket.io 集群通过 Redis 层进行通信构建。

我想知道切换到 ejabberd 是否有任何好处? XMPP 服务器会处理比 node.js+socket.io 服务器更多的并发用户吗?

老实说,并发用户数不仅仅取决于您的实施。谷歌搜索没有给我明确的答案,即哪个更可靠。 XMPP 是一个标准,因此有规则。 Web Socket 也是一个标准,但它没有一套非常具体的规则来管理消息传递。我的意见是测试两者,看看你更喜欢哪一个。如果您需要对消息的超级控制以及它们会发生什么,我建议 socket.io,如果您想要一个久经考验的标准,并且不需要超级控制,请尝试 XMPP。

此外,请检查一下:Chat server with websocket+node.js vs a native client with xmpp

XMPP 的优势在于它是标准的,并且提供了大量现成的功能。根据项目的范围和雄心,您可能需要在 socket.io.

中重新发明很多东西

关于可伸缩性,我只能说我们在可伸缩性方面与 ejabberd 取得了良好的结果。我从未尝试过 node.js / socket.io 所以我不能说。

最终还是要看你需要的功能了。

Socket.io 很难像 XMPP 当前解决方案(尤其是 ejabberd)那样扩展。

即使您决定使用 Redis 存储扩展 socket.io,因为大多数文章都提到 Socket.IO 的存储概念是建立在同步所有连接数据的想法之上的集群中的每个连接节点。您在 Socket.IO 中使用哪种商店并不重要,因为它们都在使用此概念,因为它内置于 Socket.IO 商店界面中,而不是您正在使用的商店。

为了理解为什么同步对 Socket.IO 商店不利,我们首先需要知道同步的是什么。我们可以在 Socket.IO 管理器的 initstore 函数中找到这些信息。所以这是:

  • 握手数据,握手数据包括所有请求headers、查询字符串、IP 地址、信息、URL 以及您在授权期间添加的可能的自定义数据。
  • 所有打开、连接甚至关闭的连接的 ID。
  • 房间名称和每个加入房间的id。

所有这些数据将通过 pub/sub 同步到每个连接的 Socket.IO 服务器。因此,如果您有 2 个节点进程,并且它们都使用 Socket.IO 存储,它们都将在自己的进程内存中拥有所有连接的所有数据。不像您想象的那样在 redis 中。如果您有 500 个连接用户,这可能不是问题,但是一旦您接近 5.000> 个连接,这可能会很快增加。

查看以下可能有用的文章:

Cluster fucks when scaling Socket.IO

Redis Store and Socket.io

How do I scale socket.io servers?