集群 TCP 服务器,因此可以将数据发送到所有客户端

集群 TCP 服务器,因此可以将数据发送到所有客户端

我正在开发一款实时移动应用,通过在应用和服务器后端之间建立 TCP 连接。每个用户都可以向所有其他用户发送消息。

(我用 Python 编写了 TCP 服务器扭曲,我正在创建自己的“协议”,用于应用程序/后端与托管它之间的通信亚马逊网络服务


目前,我正在尝试使后端可扩展(并且可靠)。据我所知,系统可以通过升级到更大的服务器(这可能会变得相当受限)或在集群配置中添加新服务器来应对更多用户 - 即让多台服务器位于负载平衡器后面,可能它们都访问 1 个数据库。

我概括出了它的架构: TCP服务器集群问题

但是,如果 Red 用户向所有其他连接的用户发送消息会怎样?Red 的服务器与 Red 有 TCP 连接,但与 Green 没有。

我想到了一种解决这个问题的方法:

  • 每个服务器可以与其他服务器建立开放的 TCP(或 SSL)连接。当一个服务器想要向所有用户发送消息时,它只需将其连接传递给其他服务器即可。数据库中可以保存哪些服务器在线(及其 IP 地址)的记录,其中一个服务器可以是老板- 即决定其他服务器是否正常运行,如果没有,它可以从数据库中删除它们(如果服务器正常运行但丢失了与老板它可以检查数据库,看看它是否已被删除,如果已被删除,则重新启动 - 否则它可以假设老板已关闭。

显然,这需要改进,但却展示了普遍的原则。

或者我不确定这是否可能(- 这绝对看起来像是我的一厢情愿):

  • 也许用户只需连接到一个盒子或路由器,所有服务器就可以通过它向所有用户发送消息?


如果您知道如何有效地集群 TCP 服务器,或者提供解决方案的设计模式,或者有任何意见,我将不胜感激。谢谢 :-)

答案1

根据您最终希望拥有的服务器数量,有多种方法可以实现此目的。最多约 50 台服务器,您可以选择两台或三台服务器作为“集线器”,每个集线器连接到其他每个集线器。每个非集线器连接到两个集线器。

向除您接收消息的连接之外的所有连接发送消息。如果您收到重复的消息,请忽略它。您需要跟踪最近收到的消息以检测重复消息。

您可以在数据库中跟踪运行的服务器。

或者,使用已经实现此功能的服务器设计。例如,您可以使用 IRC 服务器作为广播层。

答案2

我一直在做一个新项目,需要将 TCP 服务器分布式。我们用 Java 实现服务器。我的解决方案是使用 Hazelcast(也是用 Java 实现的)来分发一个包含所有用户的 Map 和一个用于存储 Cluster 事件的队列。

通过 Map,我可以轻松判断用户在哪个节点,因此如果服务器 A 收到用户 1 发给用户 2 的消息,服务器 A 可以查找 Map 并发现用户 2 在服务器 B 中,因此服务器 A 会将消息包装在集群事件中,目标服务器为服务器 B,并将其放入队列中。然后,服务器 B 将使用该事件并将消息发送给用户 2。

这可能会对整个集群的吞吐量和延迟产生一些影响,但据目前所知,这是可以容忍的。

相关内容