【问题标题】:Amazon DynamoDB Atomic WritesAmazon DynamoDB 原子写入
【发布时间】:2016-01-07 18:46:34
【问题描述】:

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

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

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

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

我的问题是:

  1. 这是个好主意吗?
  2. 更新是一致的和原子的吗?会不会有比赛条件?
  3. 还有比这更好的解决方案吗?

我会在这样的 UpdateItem API 调用中更新计数器 jobs_completed

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

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb aws-lambda


    【解决方案1】:

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

    【讨论】:

    • “检查 UpdateItem 调用的返回值而不是运行单独的查询”是什么意思。你能解释一下吗?
    • UpdateItem 调用中的ReturnValues 属性设置为"ALL_NEW""UPDATED_NEW"。然后来自UpdateItem 调用的响应将包含具有新jobs_completed 值的更新项目,您可以将其与total_number_of_jobs 值进行比较以确定您刚刚执行的更新是否是最后一个。您想这样做,而不是在UpdateItem 调用之后执行GetItem 调用。
    • 我明白了,我现在明白了。但是,即使我进行了单独的 GetItem 或 Query 调用,我也不应该得到相同的值,因为我进行了高度一致的调用吗?
    • 如果您进行单独的调用,您可能会遇到并发问题,即两个或多个进程都认为他们完成了最后一项工作。如果这是一个问题,那么不要进行单独的查询。
    • 谢谢你,马克,这很有启发性。没想到。
    猜你喜欢
    • 2014-05-02
    • 2018-08-27
    • 2016-05-12
    • 2012-05-27
    • 1970-01-01
    • 2011-02-03
    • 2020-08-05
    • 2011-09-30
    • 2013-08-20
    相关资源
    最近更新 更多