使用EC2实例(以及Amazon Auto Scaling和Elastic Load Balancing)我有几个在Amazon Web Services中运行的TCP服务器实例。每个EC2实例都有权访问集中式数据库(在Amazon RDS上运行)。为了使这个后端可扩展,新的EC2实例(TCP服务器的实例)根据需求进行放大和缩小。在EC2实例上扩展TCP服务器的分布式问题
服务器已经使用Python Twisted框架制造。该系统支持自定义即时消息服务,可以加入多个群聊。
当用户开始使用服务时,他们与其中一个TCP服务器建立TCP套接字。每个服务器在内存中存储当前连接的用户(即,开放的TCP套接字)以及每个用户当前“进入”(并因此订阅)的“群组聊天”。所有创建的聊天数据都存储在数据库中。
的问题
当用户A职位GroupChatZ消息,所有用户在“GroupChatZ应收到该邮件。如果只有一个TCP服务器,这很简单:它将在'该群组聊天'中为其所有用户搜索内存并向他们发送新消息。但是,由于存在多个服务器,因此在创建新消息时,该服务器必须将消息传递给所有其他服务器(即EC2实例)。
这个问题最有效的解决方案是什么? 也许使用AWS组件。
一个解决方案,我能想到的是为每个服务器来存储它的IP地址在数据库中时,第一次启动,并得到其他所有连接的服务器的IP地址和与他们建立TCP连接。当收到每条新消息时,处理该消息的服务器可以将其发送给所连接的所有其他服务器。
但是,TCP连接不是100%可靠的,这种解决方案增加了复杂性。
我怀疑居然还有使用一些Amazon Web服务组件来实现一个简单的用户,出版商型机制的好办法(认为Observer设计模式)。即其中一台服务器添加了一些其他服务器实时收到的信息。
快速更新,我刚刚开始关注Amazon SNS并创建每个Twisted服务器将订阅的主题。迄今为止的结果看起来很有希望 – 2012-03-27 01:27:23