我有一个 Lambda 工作函数列表(比如 1000 个),每个函数同时运行并完成其工作。为了能够计算出所有 worker 的最终结果,我提出了这个想法。
在开始作业和生成 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 调用的返回值而不是运行单独的查询,那么您建议的解决方案应该可以正常工作。
关于amazon-web-services - Amazon DynamoDB 原子写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34662834/