首页 > 解决方案 > 如何扩展涉及许多 2 人聊天室的应用程序?

问题描述

现在我有一个文字游戏,用户随机配对并互相发送消息。我正在使用 Node.js 和 Socket.io。基本上,我将 socket.id 存储为用户对象的键。属性之一是其合作伙伴的 socket.id。因此,当有人发送消息时,我有逻辑找到该用户并获取他们的合作伙伴 socket.id,然后我将消息发送到那个特定的 socket.id。

但是,当我在 NGINX 或其他负载均衡器后面有多个 Node 实例时,这将不起作用。我研究过使用 Redis 之类的工具,但是我发现的每个示例都涉及跨实例向用户发送相同的消息。我不会在多个实例中向成千上万的人发送相同的消息。我只是在两个人之间发送消息,但是这些小聊天室中的许多都需要存在。如果两个用户因为位于不同的 Node 实例上而无法配对怎么办?即便如此,我觉得我不应该将每条消息都发送到 Node 的每个实例,并且在所有实例上什么都不做,除了合作伙伴连接的那个实例。

任何有关解决此类问题的信息将不胜感激。

标签: node.jsredissocket.iosocket.io-redis

解决方案


这是一种方法。不确定它是否是最好的,但它看起来非常简单和可靠。

基本思想是每个用户都连接到一台服务器。比如,用户 Alice 有一个到服务器 1 的 websocket 连接,而用户 Bob 有一个到服务器 2 的连接。

然后,您有一个中央表(可能在 Redis 中,或者您将用于帐户管理的任何东西中),它说明哪些用户在哪些服务器上。每当用户连接或断开连接时,您都可以更改此设置。如果他们被允许一次连接多次,那么表需要允许这样做,但我们现在假设不是。

所以,要从 Alice 那里得到消息给 Bob,过程是:

  • Alice 将其发送到服务器 1。
  • 服务器 1 查找 Bob 的服务器,发现它是服务器 2
  • 服务器 1 将其发送到服务器 2
  • 服务器 2 将其发送给 Bob。

听起来在您的情况下,您希望保持服务器 1 和服务器 1 之间的连接打开。也许您甚至希望在每对服务器之间打开连接。N 平方连接听起来很多,但每台服务器只有 N 个,所以还不错。

不确定您使用的是什么大小的服务器,但我预计几千个 websocket 连接就可以了(甚至可能是 10k),只要流量非常低,正如您所描述的那样。所以我认为这可能会扩展到一百万用户而没有太大问题。


推荐阅读