node.js - 如何扩展涉及许多 2 人聊天室的应用程序?
问题描述
现在我有一个文字游戏,用户随机配对并互相发送消息。我正在使用 Node.js 和 Socket.io。基本上,我将 socket.id 存储为用户对象的键。属性之一是其合作伙伴的 socket.id。因此,当有人发送消息时,我有逻辑找到该用户并获取他们的合作伙伴 socket.id,然后我将消息发送到那个特定的 socket.id。
但是,当我在 NGINX 或其他负载均衡器后面有多个 Node 实例时,这将不起作用。我研究过使用 Redis 之类的工具,但是我发现的每个示例都涉及跨实例向用户发送相同的消息。我不会在多个实例中向成千上万的人发送相同的消息。我只是在两个人之间发送消息,但是这些小聊天室中的许多都需要存在。如果两个用户因为位于不同的 Node 实例上而无法配对怎么办?即便如此,我觉得我不应该将每条消息都发送到 Node 的每个实例,并且在所有实例上什么都不做,除了合作伙伴连接的那个实例。
任何有关解决此类问题的信息将不胜感激。
解决方案
这是一种方法。不确定它是否是最好的,但它看起来非常简单和可靠。
基本思想是每个用户都连接到一台服务器。比如,用户 Alice 有一个到服务器 1 的 websocket 连接,而用户 Bob 有一个到服务器 2 的连接。
然后,您有一个中央表(可能在 Redis 中,或者您将用于帐户管理的任何东西中),它说明哪些用户在哪些服务器上。每当用户连接或断开连接时,您都可以更改此设置。如果他们被允许一次连接多次,那么表需要允许这样做,但我们现在假设不是。
所以,要从 Alice 那里得到消息给 Bob,过程是:
- Alice 将其发送到服务器 1。
- 服务器 1 查找 Bob 的服务器,发现它是服务器 2
- 服务器 1 将其发送到服务器 2
- 服务器 2 将其发送给 Bob。
听起来在您的情况下,您希望保持服务器 1 和服务器 1 之间的连接打开。也许您甚至希望在每对服务器之间打开连接。N 平方连接听起来很多,但每台服务器只有 N 个,所以还不错。
不确定您使用的是什么大小的服务器,但我预计几千个 websocket 连接就可以了(甚至可能是 10k),只要流量非常低,正如您所描述的那样。所以我认为这可能会扩展到一百万用户而没有太大问题。
推荐阅读
- android - 如何查看首次社交登录 Google 和 Facebook?
- matlab - 如何解决此错误:“绘图:输入参数 #2 和 #3 的尺寸错误:尺寸不兼容。”?
- javascript - 我应该定义模型类吗?
- python - 对多个文件中的模型使用 Flask-migrate
- jquery - jQuery 和 .Net CRUD 搜索
- css - 无法使用引导程序 4 获得所需的结果。需要知道我做错了什么吗?
- python-3.x - Python 套接字接收
- r - 使用 docxtractr 时保留源 .docx 文件名和注释数据
- php - 为什么 CI 不将 count 语句转换为数组?
- python - 在 python / Spyder 3.3.2 我有 c = Count() 句子的问题,我该如何解决?