DynamoDb 全局表原子计数器区域并发写入行为

问题描述 投票:0回答:2

我们在 2 个区域拥有 dynamodb 全局表。该表包含诸如带有键 user 的网站点击量等信息以及另一列 total_user_clicks,后者又是一个数字值。为了增加这个值,我们使用原子计数器 dynamodb 功能。

让我们考虑下一种情况。在同一时刻,我们从两个不同的区域发送单个密钥的两个增量更新。我的问题是:最终的结果是什么?我们是否保证最终会是+2?或者,它可以是 +1 或 +2,具体取决于复制情况?

据我了解,如果我们复制数据库日志而不是原始行,我们保证最终会得到+2。但我在官方文档中找不到任何确认。

amazon-web-services amazon-dynamodb
2个回答
0
投票

如果

ADD
请求来自不同地区,则可以同时为+1或+2。

根据文档,如果请求在复制时更新不同区域中的同一项目,可能会导致冲突。

即使请求可以在没有冲突的情况下得到协调(即添加操作或更新同一密钥上的不同路径),它总是会引发冲突并覆盖最后一个写入者。所以前面的请求将被忽略。

因此,来自不同地区的 2 个请求有 3 种可能的情况。

  1. 结果为+1,冲突,请求1获胜。
  2. 结果为+1,冲突,请求2胜。
  3. 结果是+2,没有冲突,两个请求不重叠复制时间。

0
投票

为了确保您的数据一致并且增量操作是原子的,您需要使用带有项目集合方法的计数:可以用事件的项目集合替换单个计数器项目,事件集合可用于计算计数器价值。这种设计通常是账本的实现方式,并且基于事件溯源的思想。每个增量都成为它自己的项目,具有唯一的 ID,并且可以幂等地写入。稍后可以在客户端对这些项目进行求和以计算计数器值。这种方法不适用于阈值强制执行。

您可以在文章中找到所有详细信息 - https://aws.amazon.com/blogs/database/implement-resource-counters-with-amazon-dynamodb/ 请参阅解决方案方法 6 – 使用项目集合进行计数

© www.soinside.com 2019 - 2024. All rights reserved.