我正在开发一个托管在 AWS Lambda 上的 Flask Python 后端(使用 Zappa 自动部署到 Lambda 和 API Gateway)。我的一个端点需要大约 30-60 秒才能执行,这导致我的 API 网关有时会由于 CloudFront 限制而超时。
我正在考虑以异步方式重新实现此端点像这样。但是,我担心调用单独的 AWS Lambda 函数来运行长时间运行的任务(在从初始 Lambda 函数排队之后)并不是解决此问题的正确方法。我的理由是,Lambda 函数适用于无状态、非常快速的进程,因此使用它来执行长时间运行的端点任务似乎是错误的。有没有更好的方法来做到这一点(特别是在我现在使用的 Flask/Zappa/AWS 系统中)?
感谢您的帮助!
Lambda 是唯一可以做到以下功能的服务:
如果长时间运行的任务可以在 Lambda 15 分钟最大超时内完成,则使用 Lambda。请注意,随着 RAM 的增加,Lambda 函数可以获得更多分配的 CPU 和网络带宽,因此它们可以在 15 分钟内完成更多工作。
如果需要的时间超过 15 分钟,是否可以将其拆分为多个子任务,每个子任务在 15 分钟内完成?如果是这样,请查看具有多个并发或串行 Lambda 函数的 Step Functions。
否则,听起来您可能需要不同的计算解决方案,例如 ECS 或 EC2。然而,EC2 和基于 ECS 的持久解决方案都会产生一些持续成本。
对于不适合 Lambda 15 分钟超时的任务,另一个选择可能是考虑创建一些编排,可以在新启动的 EC2 实例上运行您的任务,该实例在任务完成时自动终止,因此您只需付费需要时用于 EC2。这个选项有点复杂,因为你必须编排它,例如通过触发 Lambda 函数来启动 EC2 实例,将任务规范传递给该 EC2 实例(例如,在启动时用户数据脚本中或通过 SMS 运行命令),监控是否成功,收集输出,完成时自动终止实例,并处理重试/失败。