位于不同地区的EC2实例之间的实时数据重复

时间:2015-05-20 22:42:00

标签: amazon-web-services amazon-ec2 redis twisted

我是AWS和后端架构的新手。我目前的配置是一个EC2实例(新加坡东南部地区),为实时聊天应用程序运行Twisted实时服务器。

目前,在我的实现中,只要发件人向服务器发送消息,如果接收者不在线,它就存储在服务器上的python字典中。所以基本上它是将这个消息存储在实例的RAM中。现在,我想让这个应用程序在全球范围内可用,因此我将在不同地区的实例上运行它。所以我的问题是,我应该如何将存储在一个实例的RAM中的这个字典复制/复制到所有其他实例,所以它在所有地区都可以使用? (将消息存储在RAM中而不是存储在数据库中的原因是应用程序的性质。该应用程序涉及大量突发发送的消息,这要求它比持久数据库存储提供的速度快得多。 ; s I / O读写。)我的目标是使应用程序在全球范围内可用,并具有实时性能。

(请不要将此问题标记为"基于意见的"问题并关闭它。我是服务器端架构的新手,我真的需要有人至少只是指向我正朝着正确的方向前进。除了StackOverflow之外,我并不认为我能在这方面寻求帮助。)

1 个答案:

答案 0 :(得分:1)

如果我必须自己构建它,我会想到一些事情(我已经在我们自己的项目中实现了大部分这些指针而且花了我很长时间)。

  • 如果您确实需要所有服务器同步,则需要consensus protocol。如果你这样做。不要自己建造。这将花费大量时间和错误。
  • 如果可以,可以将聊天数据划分为聊天室,只有少数服务器可以处理一个聊天室。
  • 我使用msgpack来编码我的数据。它比json更快更小。
  • 在通过网络发送数据之前,您将受益于大量压缩数据。看看像zlib或lz4
  • 这样的东西
  • 即使压缩的msgpack的大小与压缩的json几乎相同。我选择msgpack因为它更快。它更容易解析,因为它的长度是前缀编码的。
  • 我会尝试一起发送消息。每隔x ms批量处理所有消息。在我的项目中,我选择100ms批处理消息将为您节省大量带宽,因为您的压缩算法可以消除更多重复。
  • 您必须处理连接超时。当您收到回复时,只将邮件视为sentdone(您必须设计/选择协议来处理)
  • 想一想什么是可以接受的,当事情崩溃或以其他方式失败时你愿意放弃多少数据。如果您不愿意丢失数据,则必须实现将数据存储到磁盘的内容。
  • 我遇到的问题是写入我们使用的数据库(Google Cloud Datastore)也需要很长时间。比如在100ms到900ms之间,取决于我存储多少。我所做的只是每x秒存储一次这个数据,并在下次运行时需要保存的对象上设置标志。当然,如果你在程序崩溃时愿意丢失一些数据,那么你只能这样做。
  • 您需要一些东西来跟踪正在运行的服务器以及哪个服务器负责哪个数据
  • 设置检查您的连接是否存活的内容。例如,每隔x次发送echoRequests和echos。越早发现faillure越好。但是请注意,如果您的反应堆被某些cpu密集型任务阻止,它将不会及时发送您的回声。
  • 如果您无法控制数据的来源,则必须减慢或惩罚连接,否则这些连接会占用您的所有服务器时间。
编辑:我现在才看到你正在研究redis。据我所知,这是一个很好的排队系统。如果可以,请使用它。实施上述内容需要花费大量时间才能做到正确。