amazon-web-services - 位于不同区域的 EC2 实例之间的数据实时复制

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

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

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

(请不要将此问题标记为“基于意见”的问题并关闭它。我是服务器端架构的新手,我真的需要有人至少为我指明正确的方向。而且我不我想我可以在 StackOverflow 以外的任何地方找到这方面的帮助。)

最佳答案

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

  • 如果您真的需要所有服务器同步,您将需要 consensus protocol .如果你这样做。不要自己 build 这个。这将花费大量时间和错误。
  • 如果可以,将您的聊天数据划分到聊天室中,并且只有几台服务器处理一个聊天室。
  • 我使用 msgpack 对我的数据进行编码。它比 json 更快更小。
  • 在通过网络发送数据之前,压缩数据对您大有裨益。看看 zlib 或 lz4 之类的东西
  • 即使压缩后的 msgpack 的大小与压缩后的 json 几乎相同。我会选择 msgpack 因为它更快。它更容易解析,因为它是长度前缀编码的。
  • 我会尝试一起发送消息。每 x 毫秒对所有消息进行一次批处理。在我的项目中,我选择了 100 毫秒的消息批处理将为您节省大量带宽,因为您的压缩算法可以消除更多重复。
  • 您必须处理连接超时。仅当您收到回复时才将消息视为已发送已完成(您必须设计/选择您的协议(protocol)来处理该消息)
  • 想想什么是可以接受的,当出现崩溃或其他故障时您愿意丢失多少数据。如果您不愿意丢失数据,则必须实现将数据存储到磁盘的方法。
  • 我遇到过写入我们使用的数据库 (Google Cloud Datastore) 也需要很长时间的问题。大约在 100 毫秒到 900 毫秒之间,具体取决于我存储了多少。我所做的只是每隔 x 秒存储一次这些数据,并在下次运行时需要保存的对象上设置标志。当然,只有当您愿意在程序崩溃时丢失一些数据时,您才能这样做。
  • 您需要一些东西来跟踪哪些服务器正在运行以及哪个服务器负责哪些数据
  • 设置一些东西来检查您的连接是否有效。例如,每 x 次发送一次 echoRequests 和 echo。越早发现故障越好。但是请注意,如果您的 react 堆被某些 CPU 密集型任务阻塞,它不会及时发送您的回显。
  • 如果您无法控制传入的数据量,您将不得不减慢或惩罚连接,否则会占用您所有的服务器时间。

编辑:我现在才看到您正在研究 Redis。据我所知,这是一个很好的排队系统。如果可以,请使用它。实现上述内容需要花费大量时间才能正确完成。

关于amazon-web-services - 位于不同区域的 EC2 实例之间的数据实时复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30361608/

相关文章:

python - 如何使用 boto3 从 s3 获取最后修改的文件名

amazon-web-services - 如何在 Xvfb 上运行 headless Firefox

php - 通过 AWS EC2 负载均衡器将 HTTP 强制转换为 HTTPS

雷迪斯 : Connection Closed by Server Error with Django

amazon-web-services - 如何将 docker 容器镜像更新从 AWS ECR 部署到 ECS?

node.js - AWS Lambda : Can those event can be integrated with API Management Tools?

java - 无法从我的桌面连接到 ec2 上的 rabbitmq

php - 无法通过 AWS EC2 实例使用 PHP 连接到 AWS MYSQL RDS 实例

node.js - Node redis - id 生成竞争条件

java - spring security 已经给了token 是不是还要写一个代码把token 存到redis 中?