使服务器集群了解不同集群上的用户
Make server clusters aware of users on separate clusters
在开始之前,让我们为我的问题设置一个示例用例。我们的聊天应用程序的用户数量正在迅速增长,我们必须扩展服务器应用程序的 运行 个实例。语言实现无关紧要,但很可能在 Java 或 C++ 中完成。
让一台服务器接受所有客户端并向用户发送消息非常容易。您基本上可以拥有一个用户池,然后将消息发送给正确的连接用户。效果很好。然而,正如我所说,用户群正在迅速增长,我们被迫扩张。然后假设我们让我们的服务器知道其他服务器节点。所以你现在有 node1 和 node2。在 TCP/IP.
之上使用自己的协议相互连接并相互通信
节点1和节点2可以互相询问某个用户是否已连接,如果是,则消息将转发给另一个节点,如果找不到用户,消息将最终到达正确的用户自己的节点。工作完美,几乎类似于 EMQ 已经实现,没有单点故障。
现在假设我们正在发展壮大到 Facebook 的规模。不现实,但假设我们做到了。显然,我们团队中有很多专家知道如何实施和设计这种架构,并且可能很乐意向我解释它,但现在情况并非如此。
我们决定设置节点集群。例如,每个集群有大约 20 个节点。每个节点在其自己的集群中相互了解。假设我们有三个集群,'Fred' 连接到 cluster1 并且'Fish' 连接到 cluster2.
现在 Fred 向 Fish 发送消息。 cluster1 如何知道 cluster2 及其用户?
我想到了一些事情。 1)我可以创建一个redis实例并将每个用户会话与用户连接的集群和节点一起存储在那里,然后将消息发送到正确的集群和节点OR 2) 询问每个集群是否其中一个节点有一个名为 Fish OR 的用户 3) 将消息存储在一些数据库中并轮询是否有来自其他集群的传入消息。
我喜欢选项 1,但我不确定这样做是否正确。选项 2 对于集群的负载平衡器来说听起来有点沉重。选项 3 不太适合用例,因为我们希望实时传递此消息。
我只是不知道如何实现它。 Facebook、Twitter 和任何其他实时向其用户提供消息的应用程序都已经做到了,我想知道如何以最有效的方式做到这一点。
我建议使用网关进行用户连接。这些网关不是您的消息传递渠道,但知道如何找到它们。
你也有节点持有通道,他们只与网关对话。
每个客户端可以连接到一个网关。每个网关都连接到每个通道服务器。这样,一个客户端连接就可以访问任意数量的服务器上的通道。如果你有非常高的内部扇出,你可以有一个可靠的 UDP 协议来广播消息。
这种 NxM 安排允许您扩展客户端连接和通道。
顺便说一句,这就是大多数金融交易的工作方式。这些是为亚毫秒延迟而设计的,并且可以具有非常高的消息速率,例如每秒 1000 万。
在开始之前,让我们为我的问题设置一个示例用例。我们的聊天应用程序的用户数量正在迅速增长,我们必须扩展服务器应用程序的 运行 个实例。语言实现无关紧要,但很可能在 Java 或 C++ 中完成。
让一台服务器接受所有客户端并向用户发送消息非常容易。您基本上可以拥有一个用户池,然后将消息发送给正确的连接用户。效果很好。然而,正如我所说,用户群正在迅速增长,我们被迫扩张。然后假设我们让我们的服务器知道其他服务器节点。所以你现在有 node1 和 node2。在 TCP/IP.
之上使用自己的协议相互连接并相互通信节点1和节点2可以互相询问某个用户是否已连接,如果是,则消息将转发给另一个节点,如果找不到用户,消息将最终到达正确的用户自己的节点。工作完美,几乎类似于 EMQ 已经实现,没有单点故障。
现在假设我们正在发展壮大到 Facebook 的规模。不现实,但假设我们做到了。显然,我们团队中有很多专家知道如何实施和设计这种架构,并且可能很乐意向我解释它,但现在情况并非如此。
我们决定设置节点集群。例如,每个集群有大约 20 个节点。每个节点在其自己的集群中相互了解。假设我们有三个集群,'Fred' 连接到 cluster1 并且'Fish' 连接到 cluster2.
现在 Fred 向 Fish 发送消息。 cluster1 如何知道 cluster2 及其用户?
我想到了一些事情。 1)我可以创建一个redis实例并将每个用户会话与用户连接的集群和节点一起存储在那里,然后将消息发送到正确的集群和节点OR 2) 询问每个集群是否其中一个节点有一个名为 Fish OR 的用户 3) 将消息存储在一些数据库中并轮询是否有来自其他集群的传入消息。
我喜欢选项 1,但我不确定这样做是否正确。选项 2 对于集群的负载平衡器来说听起来有点沉重。选项 3 不太适合用例,因为我们希望实时传递此消息。
我只是不知道如何实现它。 Facebook、Twitter 和任何其他实时向其用户提供消息的应用程序都已经做到了,我想知道如何以最有效的方式做到这一点。
我建议使用网关进行用户连接。这些网关不是您的消息传递渠道,但知道如何找到它们。
你也有节点持有通道,他们只与网关对话。
每个客户端可以连接到一个网关。每个网关都连接到每个通道服务器。这样,一个客户端连接就可以访问任意数量的服务器上的通道。如果你有非常高的内部扇出,你可以有一个可靠的 UDP 协议来广播消息。
这种 NxM 安排允许您扩展客户端连接和通道。
顺便说一句,这就是大多数金融交易的工作方式。这些是为亚毫秒延迟而设计的,并且可以具有非常高的消息速率,例如每秒 1000 万。