Amazon DynamoDB 原子写入
Amazon DynamoDB Atomic Writes
我有一个 Lambda 辅助函数列表(比如 1000 个),每个 运行 同时执行其工作。为了能够计算出所有工人的最终结果,我想出了这个主意。
在开始作业和生成 Lambda 工作函数之前,我在 DynamoDB 中保存了一条记录,例如两个属性:
total_number_of_jobs
jobs_completed
(初始设置为 0)
在每个 Lambda 工作函数完成时,它将去并将属性 jobs_completed
递增 1。然后读取记录并检查total_number_of_jobs
是否等于jobs_completed
,如果是,则在SQS中放入一条记录。
我的问题是:
- 这是个好主意吗?
- 更新是否一致且原子化?会不会有竞争条件?
- 还有比这更好的解决方案吗?
我会在 UpdateItem API 调用中更新计数器 jobs_completed
,如下所示:
SET jobs_completed = jobs_completed + :incr_by
其中 incr_by
等于 1
.
只要您使用 DynamoDB 原子计数器,就像您的示例所示,并且您检查 UpdateItem 调用的 return 值而不是 运行 一个单独的查询,那么您建议的解决方案应该有效很好。
我有一个 Lambda 辅助函数列表(比如 1000 个),每个 运行 同时执行其工作。为了能够计算出所有工人的最终结果,我想出了这个主意。
在开始作业和生成 Lambda 工作函数之前,我在 DynamoDB 中保存了一条记录,例如两个属性:
total_number_of_jobs
jobs_completed
(初始设置为 0)
在每个 Lambda 工作函数完成时,它将去并将属性 jobs_completed
递增 1。然后读取记录并检查total_number_of_jobs
是否等于jobs_completed
,如果是,则在SQS中放入一条记录。
我的问题是:
- 这是个好主意吗?
- 更新是否一致且原子化?会不会有竞争条件?
- 还有比这更好的解决方案吗?
我会在 UpdateItem API 调用中更新计数器 jobs_completed
,如下所示:
SET jobs_completed = jobs_completed + :incr_by
其中 incr_by
等于 1
.
只要您使用 DynamoDB 原子计数器,就像您的示例所示,并且您检查 UpdateItem 调用的 return 值而不是 运行 一个单独的查询,那么您建议的解决方案应该有效很好。