如何避免对 lambda 的并发请求

How to avoid concurrent requests to a lambda

我有一个 ReportGeneration lambda,它接受来自客户端的请求并将以下条目添加到 DDB table。

Customer ID <hash key>
ReportGenerationRequestID(UUID) <sort key>
ExecutionStartTime
ReportExecutionStatus < workflow status>

我已在此 table 上启用 DDB 流触发器,并且此 table 中的创建条目会触发报告生成工作流。这是一个多步骤的工作流程,需要一段时间才能完成。 其中 ReportExecutionStatus 是报表处理工作流的状态。 我应该维护客户发起的所有报告生成请求的历史记录。

现在我要做的是避免同一客户的并发处理请求,因此如果已经为客户生成报告,请不要在 DDB 中创建另一条记录?

考虑的选项:

问题:如果客户在一瞬间点击生成报告,会触发两个lambdas,导致DDB中有2个entires并且会启动两个并行工作流,这是我不想要的。

有人可以推荐什么是确保同一客户的同一报告没有并发执行(2 个工作流)的最佳方法。 简而言之,当一项执行正在进行时,另一项执行不应开始。

据我所知,限制并发 Lambda 执行的数量是不可能的。这就是 AWS Lambda 的全部意义所在,可以轻松地同时扩展和 运行 多个 Lambda。

也就是说,使用名为“Strongly Consistent Reads

的 DynamoDB 功能可能有更好的解决方案来解决您的问题

默认情况下,对 DynamoDB 的读取(如果您使用 AWS SDK)最终是一致的,导致您观察到的行为:两次写入相同的 table 但您的 Lambda 只能注意到其中之一那些写。

如果您使用强一致性读取,文档说明:

When you request a strongly consistent read, DynamoDB returns a response with the most up-to-date data, reflecting the updates from all prior write operations that were successful.

因此您的 Lambda 需要对您的 table 执行高度一致的读取,以检查客户是否已经有工作 运行ning。如果已有作业 运行ning Lambda 不会创建新作业。

您可以使用 ConditionExpression to only create the entry if it doesn't already exist - if you need to check different items, than you can use DynamoDB Transactions 检查另一个项目是否已存在,如果不存在,请创建您的项目。

这些将是使用 DynamoDB 的方法,获得更高的一致性。

另一种选择是使用 SQS FIFO 队列。您可以按客户 ID 对它们进行分组,这样您就不会同时处理同一客户的消息。此外,通过此 SQS 解决方案,您可以获得使用 SQS 的所有优势 - 例如自动重试机制或死信队列。