重要提示:
我已经在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个数据库。
我勾勒出了这个粗糙的架构:
但是如果Red用户向所有其他连接用户发送消息怎么办? Red的服务器与Red有TCP连接,但没有Green。
我可以想到一种解决这个问题的方法:
显然,这需要改进,但显示了一般原则。
另外,我不确定这是否可行( - 我似乎一厢情愿的想法):
如果你知道如何有效地集群TCP服务器,或者提供解决方案的设计模式,或者有任何意见,那么我将非常感激。谢谢: - )
答案 0 :(得分:3)
您需要决定(或者如果您已经这样做 - 与我们分享这些决定)系统的可靠性要求:如果所有消息都发送给所有用户(例如,一台或多台服务器崩溃),您能否容忍在服务器崩溃时向同一用户发送两次相同的消息?您的系统复杂性直接取决于这些决策。
最简单的版本是在服务器崩溃时未向所有用户发送消息。您的所有服务器都保持彼此的TCP连接。其中一个接收来自用户的消息,并将其发送给所有其他连接的用户(到此服务器)和所有其他连接的服务器。其他服务器将此消息发送给其所有用户。要扩展系统,您只需运行连接到所有现有服务器的其他服务器。
答案 1 :(得分:2)
了解如何使用 IRC服务器处理它。他们基本上可以做到这一点。 Everbody可以在所有服务器上发送给所有其他人。或者只是单个用户,也可以在另一台服务器上。而对于群体,称为“渠道”。它最适合在服务器之间路由。
如果你能确保服务器彼此了解并且可以互相交谈,那就不难了。
旁注:9/11,最可靠的互联网新闻来源是IRC网络。所有www网站都因带宽而下降;他们花了很长时间才得到一个纯文本网页备份。在此期间,IRC网络能够在大西洋上提供接近实时,适度的新闻频道。您可能无法再登录到另一端的服务器,但至少服务器能够保持服务器到服务器的连接。
答案 2 :(得分:0)
一个显而易见的选择是使用DB作为消息的交换中心。无论如何,你必须在某处存储传入的消息,以免在服务器突然崩溃时丢失。将传入的消息放入中央数据库,并让TCP服务器上的通知进程获取消息并将其发送给正确的用户。
答案 3 :(得分:0)
TCP服务器无法集群,您在此处放置的快照是典型的HTTP服务器示例。 由于设备将TCP连接发送到服务器,比如纯套接字,现在将建立一个负载均衡服务器。