Amazon DynamoDB 原子写入

Shi*_*hti 4 amazon-web-services amazon-dynamodb aws-lambda

我有一个 Lambda 工作函数列表(比如 1000 个),每个函数同时运行并完成其工作。为了能够弄清楚所有工人的最终结果,我提出了这个想法。

在开始作业并生成 Lambda 辅助函数之前,我在 DynamoDB 中保存一条记录,例如两个属性:

  • total_number_of_jobs
  • jobs_completed(初始设置为0)

每个 Lambda 工作函数完成后,它都会将属性加jobs_completed一。然后读取记录并检查是否total_number_of_jobs等于jobs_completed,如果是,则将记录放入SQS中。

我的问题是:

  1. 这是一个好主意吗?
  2. 更新会是一致的和原子的吗?是否存在任何竞争条件?
  3. 还有比这更好的解决方案吗?

jobs_completed我将在 UpdateItem API 调用中更新计数器,如下所示:

SET jobs_completed = jobs_completed + :incr_by其中incr_by将等于1.

Mar*_*k B 5

只要您使用 DynamoDB 原子计数器(如您的示例所示),并且检查 UpdateItem 调用的返回值而不是运行单独的查询,那么您建议的解决方案应该可以正常工作。

  • 将“UpdateItem”调用中的“ReturnValues”属性设置为“ALL_NEW”或可能为“UPDATED_NEW”。然后,“UpdateItem”调用的响应将包含具有新“jobs_completed”值的更新项目,您可以将其与“total_number_of_jobs”值进行比较,以确定您刚刚执行的更新是否是最后一项。您希望执行此操作,而不是在“UpdateItem”调用之后执行“GetItem”调用。 (2认同)
  • 如果您进行单独的调用,您可能会遇到并发问题,其中两个或多个进程都认为它们完成了最后一项作业。如果这是一个问题,那么不要进行单独的查询。 (2认同)