如何扩展包含多个2人聊天室的应用程序?

jogvjijk  于 2021-06-10  发布在  Redis
关注(0)|答案(1)|浏览(401)

现在我有一个文字游戏,用户随机配对,互相发送信息。我正在使用node.js和socket.io。基本上,我将socket.id存储为用户对象的密钥。其中一个属性是其合作伙伴的socket.id。因此,当有人发送消息时,我有逻辑找到该用户并获取其合作伙伴socket.id,然后将消息发送到特定的socket.id。
但是,当我在nginx或其他负载平衡器后面有多个node示例时,这就行不通了。我研究过使用redis这样的工具,但是我发现的每个例子都涉及跨示例向用户发送相同的消息。我不是通过多个示例向成千上万的人发送相同的消息。我只是在两个人之间发送信息,但是这些小聊天室需要存在很多。如果两个用户由于在节点的不同示例上而无法配对呢?即使这样,我也觉得我不应该把每个消息都发送到node的每个示例上,并且除了合作伙伴连接的示例之外,其他所有示例上都不使用它。
任何关于解决这类问题的信息都将不胜感激。

p4tfgftt

p4tfgftt1#

这里有一种方法。不知道这是不是最好的,但它似乎很简单和可靠。
其基本思想是每个用户都连接到一个服务器。例如,用户alice有一个到服务器1的websocket连接,用户bob有一个到服务器2的连接。
然后你有一个中心表(也许在redis中,或者你将要用来管理帐户的任何东西),它告诉你哪些用户在哪些服务器上。每当用户连接或断开连接时,您都可以更改此设置。如果允许它们一次连接多次,那么表需要考虑到这一点,但假设现在不允许。
所以,要想从爱丽丝那里得到一条信息给鲍勃,过程是:
爱丽丝把它发送到服务器1。
服务器1在服务器上查找bob,发现它是服务器2
服务器1将其发送到服务器2
服务器2把它发送给鲍勃。
在您的情况下,您可能希望保持服务器1和服务器1之间的连接处于打开状态。也许你甚至想在每一对服务器之间打开连接。n平方连接听起来很多,但是每个服务器只有n个,所以还不错。
不确定您使用的服务器的大小,但我希望几千个websocket连接都可以(甚至可能是10k),只要您描述的流量非常低。所以我认为这可能会扩展到100万用户而不会有太多问题。

相关问题