如何使带有房间的 node.js 服务器可扩展

Posted

技术标签:

【中文标题】如何使带有房间的 node.js 服务器可扩展【英文标题】:How to make a node.js server with rooms scalable 【发布时间】:2012-10-15 18:29:18 【问题描述】:

我设计了一个 Node.JS 服务器,它允许用户使用 websockets 登录、加入房间并与房间中的其他用户交换数据。不过,我现在正在寻找一种方法来使此设置具有可扩展性。

我整个下午都在研究各种负载均衡器,例如 nginx 和 haproxy,但我仍然不知道如何组织我的设置。

最初用户可以登录并查看活动房间。让这部分可扩展没什么大不了的。然而,他们可以加入一个特定的房间,此时他们需要与房间中的其他人连接到同一个 node.js 实例。这部分我很难搞清楚。

目前我的解决方案是创建两种不同类型的 node.js 实例。一种处理登录和房间概览请求方法的通用类型和一种处理多个房间的房间类型。然后,泛型类型会跟踪哪个特定实例负责哪个房间,并可以将正确的地址传递给用户的应用程序。

但是我对这个解决方案不满意,所以我愿意接受建议。我知道这是一个相当模糊的问题,但我并不是在寻找一个确切的解决方案,而是关于如何组织所有内容的提示。

【问题讨论】:

你有可扩展聊天应用的代码吗? 【参考方案1】:

udidu 提到了一个可能的解决方案,但要扩展,您应该查看一个可扩展的发布/订阅解决方案; Redis,一个流行的数据存储,has pub/sub built in,我经常使用它,效果很好。

使用 Redis(或其他一些系统)来帮助确保您的 Node.js 应用程序的每个实例都收到有关谁在哪个房间聊天的信息,从而消除了房间中的所有用户都连接到同一个 Node.js 实例的依赖性。

【讨论】:

这是一个与我类似的设置。这肯定会简化 Bram 提到的很多问题。 这似乎已经是一个更好的解决方案了。但是,既然我们可能会支持大量的小房间,那么 Redis 服务器不是成为瓶颈吗? 是的,但是 Redis 相当快——当然,您必须自己进行测试,看看它是否满足您的需求。 Redis 是否容错?

以上是关于如何使带有房间的 node.js 服务器可扩展的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 node.js 使 Websocket 服务器安全

Node.js 单独或作为另一个服务器工具的伴侣

可扩展的 Node.js 应用程序架构

如何扩展 Node.js WebSocket Redis 服务器?

使用 node.js 更正了大型 RESTful API 的可扩展结构

如何使用 XAMPP 或 node.js 使 AJAX 在本地服务器上工作