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

时间:2012-01-12 15:21:02

标签: python tcp amazon-web-services twisted cluster-computing

重要提示:

我已经在ServerFault上问过这个问题:https://serverfault.com/questions/349065/clustering-tcp-servers-so-can-send-data-to-all-clients,但我也想对这个问题有一个程序员观点


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

(我正在使用Twisted在Python中创建TCP服务器,我正在为app / backend之间的通信创建我自己的'协议'并在Amazon Web Services上托管它。)


目前我正在努力使后端可扩展(可靠)。据我所知,系统可以通过升级到更大的服务器(可能变得相当有限)或通过在群集配置中添加新服务器来应对更多用户 - 即在负载均衡器后面放置多个服务器,可能与他们都可以访问1个数据库。

我勾勒出了这个粗糙的架构: TCP server cluster problem

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

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

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

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

另外,我不确定这是否可行( - 我似乎一厢情愿的想法):

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


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

4 个答案:

答案 0 :(得分:3)

您需要决定(或者如果您已经这样做 - 与我们分享这些决定)系统的可靠性要求:如果所有消息都发送给所有用户(例如,一台或多台服务器崩溃),您能否容忍在服务器崩溃时向同一用户发送两次相同的消息?您的系统复杂性直接取决于这些决策。

最简单的版本是在服务器崩溃时未向所有用户发送消息。您的所有服务器都保持彼此的TCP连接。其中一个接收来自用户的消息,并将其发送给所有其他连接的用户(到此服务器)和所有其他连接的服务器。其他服务器将此消息发送给其所有用户。要扩展系统,您只需运行连接到所有现有服务器的其他服务器。

答案 1 :(得分:2)

了解如何使用 IRC服务器处理它。他们基本上可以做到这一点。 Everbody可以在所有服务器上发送给所有其他人。或者只是单个用户,也可以在另一台服务器上。而对于群体,称为“渠道”。它最适合在服务器之间路由。

如果你能确保服务器彼此了解并且可以互相交谈,那就不难了。

旁注:9/11,最可靠的互联网新闻来源是IRC网络。所有www网站都因带宽而下降;他们花了很长时间才得到一个纯文本网页备份。在此期间,IRC网络能够在大西洋上提供接近实时,适度的新闻频道。您可能无法再登录到另一端的服务器,但至少服务器能够保持服务器到服务器的连接。

答案 2 :(得分:0)

一个显而易见的选择是使用DB作为消息的交换中心。无论如何,你必须在某处存储传入的消息,以免在服务器突然崩溃时丢失。将传入的消息放入中央数据库,并让TCP服务器上的通知进程获取消息并将其发送给正确的用户。

答案 3 :(得分:0)

TCP服务器无法集群,您在此处放置的快照是典型的HTTP服务器示例。 由于设备将TCP连接发送到服务器,比如纯套接字,现在将建立一个负载均衡服务器。