socket.io通过多个服务器没有redis

我的API端点分布在多个服务器上的多个位置,我想弄清楚如何处理连接客户端上的套接字更新。 我真的想避免有一个单一的Redis数据库设置只是为了处理连接的客户端,通过许多服务器。

我不会必须广播消息,套接字消息将始终发送给单个用户。 虽然我知道每个连接的客户端渠道ID我不知道是否有可能向一个用户发送一条消息,当我手中只有渠道ID,例如最初的连接是与其中一个集群中的另一台服务器。

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

感谢大家可以给我一个更深入的解释什么是最好的办法做到这一点。

目前还不清楚你在问什么。 当用户连接到各种服务器并且想要从一台服务器向特定用户发送消息时,则必须最终将该消息传递给用户所连接的服务器,以便可以通过用户连接。

有很多方法可以做到这一点:

  1. 中央数据库。 维护一个中央数据库,告诉你在任何给定的时间用户连接到哪个服务器。 然后,当你想发送消息给userA时,你可以在中央数据库中查找它们,发现它们当前连接到Server12,然后你可以让Server12发送消息给它们。 这是socket.io redis解决scheme使用的策略。 这种策略可能会在中央数据库中造成瓶颈,因为所有服务器都必须使用相同的中央数据库来“查找”给定用户连接的位置。

  2. 负载平衡algorithm 。 创build一个负载均衡algorithm,根据用户ID(通常使用用户ID散列,然后在当前活动的服务器数量之间平均分配)来计算给定用户将连接到哪个服务器。 在这种scheme中,当用户连接时,它们被负载平衡到algorithmselect的服务器。 因此,userA总是会被发送到Server12,例如。 然后,在服务器场中的其他位置,如果要发送消息给userA,则可以使用相同的algorithm来计算将连接到哪个服务器,并可以联系该服务器以请求将消息发送给它们。 当您想要更改活动服务器的数量时,此scheme可能会遇到困难,因为这会导致负载平衡algorithm发生变化,要求所有现有用户通过新algorithm重新连接,以使其连接再次可预测。

  3. 将出站消息广播到所有服务器。 将特定用户的外发消息广播给所有服务器。 在这种情况下,如果Server10要发送消息给userA,它首先检查是否已经有userA的连接。 如果是这样,它只是发送消息。 如果没有,那么它只是向所有其他活动服务器广播它想要发送这个特定消息给UserA。 每个服务器将检查它的连接列表,如果它有一个UserA的连接,它将发送消息给UserA。 这种方法对于高stream量(例如,因为所有服务器接收所有出站消息而具有许多消息的情况)不能很好地扩展,但是可以针对大量用户进行扩展,但是stream量低。

  4. 每个服务器维护自己的连接索引,广播传入连接和断开所有服务器。 在这个scheme中,每个服务器为所有连接的用户维护一个内存中索引。 每当用户连接到特定的服务器时,该服务器就会向所有其他服务器广播UserA现在连接到Server12。 每当UserA断开连接,断开连接也被广播。 每个服务器都会更新其每个事件的内存索引,因此在任何时候,每个服务器都有一个每个用户当前连接的实时查找表。 这种方法对于大量的用户来说并不能很好地扩展,因为每个服务器的任务是保持所有活动连接的内存索引,当任何用户连接或断开连接时,每个服务器都会收到一条消息。 但是,对于高stream量来说它确实很好,因为每个服务器都有一个快速的方法来知道给定用户连接的位置。

根据您要优化的特定情况的特定负载特性,可以将这些方法中的每一个的各个方面组合到混合解决scheme中。 例如,可以将连接和断开连接广播给N个专门的数据库服务器,然后单个服务器可以在查找给定用户连接的位置时跨越这N个数据库服务器分散负载,以减轻中央数据库的瓶颈。