我正在开发一个实时的移动应用程序,在应用程序和服务器后端之间build立一个TCP连接。 每个用户可以发送消息给所有其他用户。
(我使用Twisted在Python中创buildTCP服务器,为应用程序/后端之间的通信创build自己的“协议”并将其托pipe在Amazon Web Services上 。)
目前我正在试图使后端可扩展(和可靠)。 据我所知,系统可以通过升级到更大的服务器(可能会变得非常有限),或者通过在集群configuration中添加新的服务器来处理更多的用户 – 即有多个服务器位于负载均衡器之后, 1数据库,他们都访问。
我已经勾勒出这个粗糙的架构: 
但是,如果Red用户向所有其他连接的用户发送消息呢? Red的服务器与Red有TCP连接,但是没有与Green连接。
我可以想办法解决这个问题:
显然这需要改进,但显示了一般原则。
或者,我不确定这是否可能( – 绝对看起来像我的一厢情愿的想法):
如果您知道如何有效地对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。
可能会对整个集群的吞吐量和延迟产生一些影响,但据了解,这是可以忍受的。