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

我正在开发一个实时的移动应用程序,在应用程序和服务器后端之间build立一个TCP连接。 每个用户可以发送消息给所有其他用户。

(我使用Twisted在Python中创buildTCP服务器,为应用程序/后端之间的通信创build自己的“协议”并将其托pipe在Amazon Web Services上 。)

目前我正在试图使后端可扩展(和可靠)。 据我所知,系统可以通过升级到更大的服务器(可能会变得非常有限),或者通过在集群configuration中添加新的服务器来处理更多的用户 – 即有多个服务器位于负载均衡器之后, 1数据库,他们都访问。

我已经勾勒出这个粗糙的架构: TCP服务器集群问题

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

我可以想办法解决这个问题:

  • 每台服务器可以有一个开放的TCP(或SSL)连接与其他服务器。 当一个服务器想要发送一条消息给所有的用户时,它只是把它传递给其他服务器。 一个logging可以保存在哪个服务器在线的数据库中(和他们的IP地址),其中一个服务器可以是一个老板 – 即决定是否其他人正在运行,如果不是,可以从数据库中删除它们(如果一台服务器上了,失去了与老板的连接,它可以检查数据库,看看是否已经被删除,如果有的话,重新启动 – 否则可以认为老板已经closures了。

显然这需要改进,但显示了一般原则。

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

  • 也许用户可以连接到一个盒子或路由器,所有的服务器可以通过它的所有用户信息?

如果您知道如何有效地对TCP服务器进行群集,或提供解决scheme的devise模式,或者有任何意见,那么我将非常感激。 谢谢 :-)

有多种方法可以实现这一点,这取决于您最终期望拥有多less台服务器。 多达大约50台服务器,您可以select两台或三台服务器作为“集线器”,每个集线器连接到其他集线器。 每个非集线器连接到两个集线器。

除了接收到的连接之外,发送一条消息。 如果您收到重复的消息,请忽略它。 您需要跟踪最近收到的消息来检测重复。

您可以跟踪数据库中的操作服务器。

另外,使用已经这样做的服务器devise。 例如,您可以使用IRC服务器作为您的广播层。

我一直在做一个需要分发TCP服务器的新项目。 我们用Java实现服务器。 而我的解决scheme是使用Hazelcast(用Java实现)来分发一个包含所有用户的Map和一个用于存储集群事件的队列。

使用Map我可以很容易的告诉用户在哪个节点,所以如果serverA收到user1到user2的msg,那么serverA可以查找Map,而user2在ServerB中,所以serverA会把msg包装在一个集群事件中与目标服务器作为ServerB并将其放入队列中。 然后,ServerB将使用该事件并将该消息发送给user2。

可能会对整个集群的吞吐量和延迟产生一些影响,但据了解,这是可以忍受的。