使用AWS Lambda异步后台作业

问题描述

我想创建一个REST API,使调用者可以提交作业的输入,该作业将在后台运行大约一分钟。 因此,API应该产生一个后台作业,并立即返回一个作业ID。然后,客户端可以向另一个端点查询作业状态和结果。

我脑海中浮现的第一个念头是这样的:

  • API“提交作业lambda”会在数据库中创建作业记录,并将输入内容提交到SQS队列
  • “工人lambda”轮询SQS,执行工作并更新数据库中的工作
  • API“查询作业lambda”从数据库返回作业记录

要使其正常工作,工人lambda必须具有足够的超时时间才能完成一项大工作。 API lambda总是很快的,因为它们只是进行数据库操作并提交给SQS。

我仍然需要2个lambda,这仍然让我感到困惑。但是,如果我正确理解它,则在它向调用者返回响应之后就无法继续执行lambda函数。 我还考虑了可能在事件中使用Kinesis而不是SQS,因为执行顺序并不重要,每个调用方都只希望在合理的时间内完成工作。我的流量模式可能是突然爆发100.000个工作,然后几天都没有。 我还考虑在每个工作中支持多个子工作,以便每个工作实际上是1-100个工作单元。

我不想为工人托管实例,例如ECS上的容器;我只想依靠无服务器的概念。

这是一个不错的设置还是更好的设置?

解决方法

这似乎是AWS Step Functions的一个好用例。

您可以从API Gateway开始执行状态机,这将返回执行ID。

该执行ID可以用于执行所有必要的后台处理的query the status执行

,

您使用SQS的方法听起来不错-100.000并不是什么大问题,即使使用dynamodb作为数据存储,我也将完全没有服务器。

确保2个lambda,一个用于处理HTTP请求,第二个用于完成工作。 确保启用预配置并发以正确处理您的预期流量-https://aws.amazon.com/blogs/aws/new-provisioned-concurrency-for-lambda-functions/

关于Kinesis,这听起来不是您情况的理想选择,因为您可能有数天没有任何流量,但是kinesis流是按小时计费的,因此您无法关闭它,只能删除它。

我会坚持计划尽可能简单,如果弹出任何阻止​​程序,请尝试其他操作。