相关文章推荐
大气的警车  ·  ruby ...·  1 年前    · 
潇洒的茶壶  ·  【AIGC使用教程】GitHub ...·  1 年前    · 

在多个服务器上使用socket.io,不需要redis

1 人关注

我的api端点分布在多个地点的多个服务器上,我正试图找出如何处理连接客户端的socket更新。 我真的想避免设置一个单一的redis数据库来处理众多服务器上的连接客户。

我不需要广播信息,套接字信息将总是被发送到一个用户。 虽然我知道每个连接的客户端的通道ID,但我不确定当我手中有通道ID,并且例如初始连接是与集群中的另一个服务器建立的时候,是否有可能只向一个用户发送消息。

我看到有一个 粘性负载平衡 的选项,但我不完全确定这就是我真正需要的。

感谢每个人都能给我一个更深入的解释,什么是最好的方法。

node.js
sockets
session
cloud
aschmid00
aschmid00
发布于 2015-08-11
1 个回答
jfriend00
jfriend00
发布于 2015-08-11
已采纳
0 人赞同

我不清楚你到底在问什么。 当你有用户连接到不同的服务器,而你想从一个服务器发送消息给某个特定的用户,那么你必须最终将该消息传递给用户所连接的服务器,以便它能通过用户的连接发送消息。

有多种方法可以做到这一点。

  • 中央数据库。 维护一个中央数据库,告诉你用户在任何时候连接到哪个服务器。 然后,当你想向用户A发送消息时,你可以在中央数据库中查找他们,发现他们当前连接到了服务器12,然后你可以要求服务器12向他们发送消息。 这就是socket.io redis解决方案使用的策略。 这种策略会在中央数据库中产生一个瓶颈,因为所有的服务器都必须使用相同的中央数据库来 "查找 "某个用户的连接位置。

  • 负载平衡 算法。创建一个负载平衡算法,根据用户的ID(通常使用用户ID的哈希值,然后在当前活动的服务器数量中平均分配)来计算给定用户将连接到哪个服务器。 在这个方案中,当一个用户连接时,他们被负载平衡到一个通过算法选择的服务器。 因此,比如说,用户A将总是被送到服务器12。 然后,在你的服务器群的其他地方,如果你想给用户A发送一个消息,你可以使用同样的算法来计算他们将被连接到哪台服务器,并可以联系该服务器,要求它把消息发送给他们。 当你想改变活动服务器的数量时,这个方案会有困难,因为这将导致负载平衡算法的改变,这需要所有现有的用户通过新的算法重新连接,使他们的连接再次可预测。

  •