使服务器群集了解不同群集上的用户

时间:2016-11-04 10:32:20

标签: java c++ networking scalability high-availability

在开始之前,让我们为我的问题设置一个示例用例。我们的聊天应用程序在用户中迅速增长,我们必须扩展我们的服务器应用程序的运行实例。语言实现是无关紧要的,但很可能是用Java或C ++完成的。

让一台服务器接受所有客户端并向用户发送消息非常容易。您基本上可以拥有一个用户池,然后将消息发送给正确的连接用户。效果很好。但就像我说的那样,用户群正在快速增长,并且我们被迫扩展。然后,让我们说我们让服务器知道其他服务器节点。所以你现在拥有node1和node2。彼此连接并使用自己的TCP / IP协议相互通信。

Node1和node2可以互相询问是否连接了某个用户,如果是,则该消息将被转发到另一个节点,因此如果用户无法找到该消息,则该消息将以最终用户身份结束节点。完美且与EMQ几乎相似的工作没有单点故障。

现在让我们说,我们的增长幅度甚至超过了Facebook的规模。不太现实,但我们可以说。显然,我们的团队中有很多专家知道如何实现和设计这种架构,并且可能很乐意向我解释,但现在情况并非如此。

我们决定设置节点集群。例如,每个群集具有20个节点。每个节点都在其自己的集群中相互了解。我们假设我们有三个群集,并且' Fred '已连接到 cluster1 和' Fish '已连接到 cluster2

现在 Fred 会向 Fish 发送消息。 cluster1如何了解cluster2及其用户?

我想出了一些东西。 1)我可以创建一个redis实例,并将每个用户会话存储在用户所连接的集群和节点中,然后将消息发送到正确的集群和节点 OR 2)询问每个集群,如果其中一个节点有一个用户,所谓的 Fish 3)将消息存储在某个数据库中并进行调查如果有来自其他集群的传入消息。

我喜欢选项1,但我不确定这是否正确。对于集群的负载平衡器,选项2听起来有点重。选项3并不完全适应用例,因为我们希望实时传递此消息。

我只是不知道如何实现这一点。 Facebook,Twitter和任何其他应用程序实时向其用户提供消息已经完成了,我想知道如何以最有效的方式。

1 个答案:

答案 0 :(得分:1)

我建议使用网关进行用户连接。这些网关不是您的消息传递渠道,但知道如何找到它们。

您还拥有保存频道的节点,它们只与网关通信。

每个客户端都可以连接到一个网关。每个网关都与每个通道服务器建立连接。这样,一个客户端连接可以跨任意数量的服务器访问通道。如果您有非常高的内部扇出,您可以使用可靠的UDP协议来广播该消息。

这种NxM安排允许您扩展客户端连接和通道。

BTW这是大多数金融交易所的工作方式。这些是针对亚毫秒级延迟的设计,并且可以具有非常高的消息速率,例如每秒1000万。