用于帐户余额的DynamoDB原子计数器

时间:2016-05-17 21:24:11

标签: amazon-dynamodb

在DynamoDB中,原子计数器是一个避免竞争条件的数字

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters

什么使数字成为原子,我可以在非单位值中添加/减去浮点数吗?

目前我在做:“SET balance = balance +:change”

(长版)我正在尝试使用DynamoDB进行用户余额,因此准确性至关重要。可以同时从多个来源更新余额。没有必要预先取得余额,我们永远不会拒绝交易,我只关心当所有操作完成后,我们将保持正确的平衡。只要最终结果正确,操作也可以按任何顺序应用。

根据我的理解,这应该没问题,但我没有看到任何原子增量示例更改“1”以外的值

我犹豫不决是因为像Amazon DynamoDB Conditional Writes and Atomic Counters这样的问题建议对类似的情况使用条件式写法,这听起来像是一个糟糕的主意。如果我获取平衡,更改并执行条件写入,则在此期间值已更改时写入可能会失败。但是,平衡是业务关键的定义,忽略文档时我总是很紧张

- 附加信息 -

所有写入都来自Lambda函数,我期望写入成功率几乎达到100%。但是,我还保留所有更改的历史记录,如果余额处于“未知”状态(例如网络超时),则可以锁定表格并从历史记录中重新计算正确的余额。

我认为这是最好的“正常”操作。 99.999%的时间,所有更新都可以使用一次写入。失败可能是非常昂贵的,因为我们需要扫描客户的整个历史来重新创建平衡,但在权衡方面似乎是一个相当安全的赌注。

2 个答案:

答案 0 :(得分:2)

原子计数器的文档很清楚,在我看来,对你的用例来说是不安全的。

您正在解决的问题很常见,AWS建议在这种情况下使用乐观锁定。 请参阅以下AWS文档, http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html

答案 1 :(得分:1)

从AWS员工的回复

看来,这个概念是可行的
  

应用程序编写者通常会使用这两种方法的组合,   你可以在哪里有一个用于实时计数的原子计数器,以及一个   审计表以便以后完善会计。

https://forums.aws.amazon.com/thread.jspa?messageID=470243&#470243

还确认更新将是原子的,任何更新操作都是一致的

  

您发送到DynamoDB的所有非批处理请求都会以原子方式处理    - 请求之间没有涉及任何类型的交错。写请求也是一致的,因此任何写请求都将更新   收到请求时项目的最新版本。

https://forums.aws.amazon.com/thread.jspa?messageID=621994&#621994

事实上,对给定项目的每次写入都是非常一致的

  

在DynamoDB中,针对给定项目的所有操作都被序列化。

https://forums.aws.amazon.com/thread.jspa?messageID=324353&#324353