首页 > 解决方案 > 在 aws 中管理多个服务器中的内存缓存

问题描述

每天一次或两次将一些文件上传到 S3 存储桶。我希望在每次 s3 上传时使用每个服务器的内存数据刷新上传的数据。请注意,有多个服务器正在运行,我想在所有服务器中存储相同的数据。此外,服务器正在根据流量进行扩展(同样在新服务器启动时,旧服务器下降意味着服务器实例不会总是相同)。

就像我想将更新的数据保留在缓存中一样。

我想构建一个可以支持服务器自动缩放的架构。我通过使用 SNS 和不同服务器可以轮询的多个 SQS 遇到了 AWS 的 FAN-OUT 架构。

我们如何处理队列相对于服务器的自动缩放?或者有没有其他方法来处理这个场景?

PS:我对 AWS 环境完全陌生。这对任何参考都有很大的帮助。

标签: amazon-s3amazon-ec2aws-lambdaamazon-sqsamazon-sns

解决方案


对我来说,要完成这项工作,您需要做一些事情。这些是意见,并且与大多数建筑设计一样,肯定有不止一种方法可以处理这个问题。

我首先假设您有一个在某种 EC2 上运行的应用程序(Elastic Beanstalk、Fargate、具有自动扩展功能的原始 EC2 等),并且您已经解决了在扩展时安装和配置应用程序的问题-up 事件发生。

从概念上讲,我会有这个图表: 在此处输入图像描述

该设置涉及让 S3 存储桶将可能s3:ObjectCreated的事件发布到 SNS 主题。这些事件将在存储桶中的对象更新或创建时发布。

下一个:

  1. 在启动期间,您的应用程序将从 S3 中提取当前数据。
  2. 作为应用程序启动的一部分,创建一个以 EC2 的实例 id 命名的队列(参见此处的一些示例)该队列需要订阅 SNS 主题。如果队列已经存在,那么这不是错误。
  3. 您的应用程序将有一个后台线程或进程轮询 SQS 队列以获取消息。
  4. 如果您在队列中收到一条消息,则需要告诉应用程序从 S3 刷新缓存。
  5. 当实例关闭时,至少有来自 Elastic Beanstalk 和负载均衡器的事件表明您的实例将被关闭。移除当时绑定到实例的 SQS 队列。

唯一的问题可能是环境的硬崩溃会留下孤立队列。建议手动清理它们或定期执行清理它们的任务。


推荐阅读