我正在尝试弄清楚如何在 AWS 上部署我的应用程序。我的 DevOps 经验非常有限,而且我不确定我的设计是否好。
我有两个应用程序,一个处理文件上传的 Web 应用程序和一个对文件进行处理的处理应用程序。
我计划使用 AWS beanstalk 来处理 Web 应用程序,但对于处理应用程序,我不确定要使用哪种策略。我正在考虑使用队列 (SQS) 来分派处理作业,并将处理应用程序放在 EC2 自动扩展组上。
文件很大(几 GB)并且处理非常受 I/O 限制,因此在进行处理之前,会将文件从 s3 复制到处理机器上的本地 SSD。
其他考虑:
- 两个应用程序都需要访问同一个数据库(我需要某种 VPC 吗?)
- 我将来可能会有不同类型的处理,需要以某种方式调度到其他实例类型上的其他应用程序(可能是一些具有更多内存的机器)。
问题是:这是一个好的架构吗?我遗漏了什么重要细节吗?关于如何开始使用 AWS 有什么建议吗?
答案1
因此,我能想到的两种方法应该可以在没有作业数据库表的情况下为您工作,但如果您需要,仍然允许数据库访问。
高度可扩展的无服务器
将会使用 API 网关并设置 Lambda 函数来实际完成繁重的工作,这意味着当您不处理任何事情时,您不会浪费金钱运行不执行任何操作的系统。
您可以在这里阅读相关内容:https://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-with-lambda-integration.html
这个允许同时处理多个上传,但如果有大量频繁上传,可能会变得昂贵
然后,您的 Lambda 可以根据需要处理上传。
成本效益高,可同时持续处理少量数据
将设置一个 EC2 框,从 SQS 队列读取并逐个处理,并且设置您的应用程序,一旦它上传到 S3,它就会推送到 SQS 队列。
如果您使用此方法时开始注意到队列中的积压,则可以通过添加更多 EC2 处理实例来进行扩展。
这意味着,如果上传频率不高,您可能正在运行一个不执行任何操作的 EC2。根据您的 EC2 实例大小,您可以多次运行处理应用程序,例如,如果它是 PHP,并且您选择了 4 核 EC2,您可以在该框上并行运行 PHP 脚本 4 次。
数据库问题
第一个选项消除了处理作业数据库的需要,因为它们是通过 API 网关传入的。但如果您需要,仍可以通过 NodeJS Lambda 库连接到 RDS。第二个选项也消除了连接上传系统的需要,因为它可以使用 SQS 队列,但如果您需要,您可以像连接任何其他应用程序一样连接到 RDS。
如果您确实希望使用数据库来处理所有这些问题,而不是使用 SQS 队列,或者您有其他使用数据库的原因,您可以在默认 VPC 中设置 RDS,并使用安全组来获得访问权限,但这是不可扩展的。(IP 地址)
您可以使用第二个选项,而不使用 SQS 队列。
如果您需要在同一区域的多个可用区中运行 RDS,您可以通过设置多可用区在所有 3 个可用区中设置 RDS 来实现,然后同一区域中的任何 EC2 实例都可以访问它(这为您提供高可用性)。
如果您想要添加多区域并且不公开访问数据库,则必须在每个想要操作的区域中创建一组 VPC,并确保它们彼此对等,并且路由表已设置以允许在创建 RDS 之前通过对等进行通信,因为它需要在新的 VPC 中创建。
笔记
如果您想要多区域多可用区以实现超高可用性,我强烈建议在创建 RDS 之前,使用在 EC2 中运行 Amazon 自定义 Linux 发行版的 T2.nano 实例通过对等连接测试跨区域 ping 操作,设置所有对等连接并确保它们正常工作可能会非常复杂,先正确获取 2 个区域的流程,然后相继添加其他区域,确保所有其他区域都可以 ping 通新区域。