使用 Web 套接字的基于 XMPP 的聊天服务的架构

Posted

技术标签:

【中文标题】使用 Web 套接字的基于 XMPP 的聊天服务的架构【英文标题】:Architecture for XMPP-based chat service using web sockets 【发布时间】:2011-04-13 19:15:32 【问题描述】:

假设我想创建一个基于 Web 和 Web 套接字的聊天服务。假设我想要多个独立的聊天室。

我需要它来扩展,所以,我正在考虑使用 XMPP,这样我就可以透明地使用多个服务器。图表中显示的架构是我需要的吗?

而且,我什至需要 NodeJS 吗?

【问题讨论】:

【参考方案1】:

node.js 负载平衡器和它背后的多个 node.js 服务器怎么样。

使用 redis 之类的东西来存储数据并处理消息传递。看到这个article

然后每个客户端都驻留在 node.js 服务器上,你不在乎哪个。

每条消息都由 node.js 服务器处理(你不在乎)。

每条消息都由处理传入消息的 node.js 服务器发送到 redis。

然后每个 node.js 服务器将其拾取并将其推送到连接到该服务器和该聊天室的所有客户端。

您需要一些黑魔法才能将消息从负载平衡器上的单个 socket.io 连接传送到多个 node.js 服务器的 tcp 套接字。

【讨论】:

现在,假设我想要多个独立的聊天室。这将如何改变您的架构? @ChadJohnson 它不需要改变。通过一个 socket.io 连接处理多个房间并不难。用户对象只是获得一个附加到它的room: Array 键/值。如果您的意思是使用多个 socket.io 连接的多个聊天室,那么我们需要更少的管道黑魔法,并且可以让每个服务器处理自己的 websocket 连接。 好的。 “每条消息都会发送到 redis 中,并且每个 node.js 服务器都会将其拾取并将其推送给所有客户端”是我认为需要更改的内容。 @ChadJohnson 稍微重新措辞。是的,他们不会推送给所有客户,他们只会推送给“订阅”所述房间的客户。您只需过滤客户列表。这是一个微不足道的扩展。在不同的套接字上拥有多个独立的网络聊天服务器需要真正的架构更改。 @Raynos 你能链接到另一篇类似的文章吗?你是指redis的一些pubsub特性吗?

以上是关于使用 Web 套接字的基于 XMPP 的聊天服务的架构的主要内容,如果未能解决你的问题,请参考以下文章

如何在nodejs的xmpp服务器中传递动态聊天ID

Web 应用程序最有效的通知系统

XMPP 服务器和自定义 API

基于 Tornado 的 XMPP 服务器和客户端

是否可以使用公共 XMPP 服务器来创建私人聊天室?

XMPP 聊天和通知一起?