amazon-dynamodb - DynamoDB - 全局表冲突解决
问题描述
如果应用程序几乎同时在不同区域更新同一项目,则可能会出现冲突。为确保最终一致性,DynamoDB 全局表在并发更新之间使用“最后写入者获胜”协调,其中 DynamoDB 尽最大努力确定最后写入者。通过这种冲突解决机制,所有副本将就最新更新达成一致,并收敛到它们都具有相同数据的状态。
这就是 AWS 文档所说的。我不明白“最后一位作家获胜”政策如何导致一致的全球数据库?
例如
区域 1 获得写入顺序 T1(设置值为 0) T2(设置值为 5) 区域 2 获得写入顺序 T2(设置值为 5) T1(设置值为 0)
记录在 2 个地方以不同的顺序应用,最终结果不同。区域 1 的值为 5,区域 2 的值为 0。
这真的是 DynamoDB 所做的吗?
解决方案
我会说“不”。不像你描述的那样。
冲突解决仅适用于以下情况:T1 是直接写入区域 1,随后复制到区域 2...,而 T2 是近并发直接写入区域 2 中的同一项目(不同数据),随后复制到区域1.
您所描述的是最初发送到单个区域的写入的无序复制,这不是问题,因为复制本身是按顺序发生的。全局表复制使用 DynamoDB Streams,它捕获按时间排序的项目级修改序列。
如果您的应用程序只写入单个区域,则不会发生这种意义上的冲突,因为任何其他区域将始终看到更新按顺序复制。
“最后写入者获胜”意味着当直接写入 R2 的更新 T2 通过复制到达 R1 时,R1 看到 T2 发生的时间晚于 T1,并将其应用到 R1 ......但是当更新 T1 写入直接到 R1,通过复制到达 R2,R2 发现它发生的时间早于 T2 并丢弃它(不在 R2 应用它),因为 T2 是最后发生的写入(及时)。
推荐阅读
- angular - ng-bootstrap 弹出数据库内容
- php - 如何停止在foreach中覆盖数组
- javascript - 在 Javascript 中调用嵌套的 div 类。修改后的代码在 WordPress 中不起作用
- java - 相当于python中的objectmapper
- python - 在一堆行上使用 lstrip 时,只有以 'r' 开头的那些会受到影响,而 'r' 会被删除,保持其他相同
- swift - 在一行中找到重复的序列
- ios - 向特定用户 AWS SNS 发送推送/电子邮件通知
- python - 使嵌套“For”循环更快的替代方法(产品推荐)
- docker - elasticsearch.yml 在使用 Kubernetes ConfigMap 加载时是只读的
- php - 为什么 queue:work 在 Laravel 5.7 的 1 次迭代后停止?