使用 EC2 实例(以及 Amazon Auto Scaling 和 Elastic Load Balancing)我有几个 TCP 服务器实例在Amazon Web Services中运行。每个 EC2 实例都可以访问一个集中式数据库(在 Amazon RDS 上运行)。为了使这个后端具有可扩展性,新的 EC2 实例(TCP 服务器的)会根据需求进行扩展和缩减。
服务器是使用Python Twisted框架制作的。该系统支持自定义即时消息服务,用户可以加入多个群聊。
当用户开始使用该服务时,他们会与其中一个 TCP 服务器建立一个 TCP 套接字。每个服务器在内存中存储当前连接的用户(即打开的 TCP 套接字)以及每个用户当前“加入”的“群聊”(并因此订阅)。创建的所有聊天数据都存储在数据库中。
问题
当 UserA 在 GroupChatZ 中发布消息时,GroupChatZ 中的所有用户都应该收到该消息。如果只有 1 个 TCP 服务器,这很简单:它将在其内存中搜索“群聊”中的所有用户并向他们发送新消息。然而,由于有多个服务器,当创建一条新消息时,该服务器必须将消息传递给所有其他服务器(即 EC2 实例)。
解决这个问题最有效的方法是什么?也许使用 AWS 组件。
我能想到的一种解决方案是,每台服务器在首次启动时将其 IP 地址存储在数据库中,并获取所有其他已连接服务器的 IP 地址并与它们建立 TCP 连接。当收到每条新消息时,处理它的服务器可以将它发送到它所连接的所有其他服务器。
然而,TCP 连接并非 100% 可靠,而且这种解决方案增加了复杂性。
我怀疑实际上有一种很好的方法可以使用一些 Amazon Web Services 组件来实现简单的订阅者-发布者类型机制(想想观察者设计模式)。即,一台服务器添加了一些东西,所有其他服务器都从它那里实时获取消息。