基于 AWS DynamoDB 分布式锁

分布式锁是一个复杂的挑战,因为你需要以原子方式确保在任何给定时间内只有一个参与者在修改某个有状态的资源。例如,假设你有一个数据库,它作为你的应用程序的中央事实来源。为了确保数据始终准确,你需要确保在你的应用服务器集群中,只有一个应用服务器在修改数据库中的某条特定记录。

AWS DynamoDB 分布式锁原理

  1. 主机 A 通过向锁表写入一个键为 "Moe" 的条目来获取锁,前提是锁表中尚不存在键为 "Moe" 的条目。主机 A 使用版本号(RVN)为 UUID1 获取了锁。

  2. 主机 B 尝试获取 "Moe" 的锁,并使用版本号(RVN)为 UUID2。

  3. 主机 B 首先通过 GetItem 调用检查是否已经存在一个锁。

  4. 在这种情况下,主机 B 发现主机 A 持有 "Moe" 的锁,其记录版本号(RVN)为 UUID1。由于主机 A 和主机 B 运行的是相同的应用程序,因此主机 B 期望,如果主机 A 想继续持有 "Moe" 的锁,它会在 10 秒内发送心跳并续约锁。主机 A 发送了一次心跳,并通过对键为 "Moe" 的锁进行条件更新,将锁的 RVN 更新为 UUID3。

  5. 主机 B 在第一次尝试获取锁后的 10 秒后,通过条件 UpdateItem 调用检查锁的 RVN 是否已更改,并使用 RVN 为 UUID4 进行检查。

  6. 主机 A 成功更新了锁。因此,主机 B 发现新的 RVN 等于 UUID3,并再等待了 10 秒。主机 A 在第一次心跳后崩溃,因此它没有将 RVN 从 UUID3 再次更改。当主机 B 第三次尝试获取 "Moe" 的锁时,它发现 RVN 仍然是 UUID3,与第二次尝试获取锁时检索到的 RVN 相同。

  7. 在这种情况下,由于主机 A 和主机 B 运行的是相同的应用程序,主机 B 期望,如果主机 A 健康并打算继续持有锁,它会发送心跳。因此,主机 B 认为 "Moe" 的锁已过期。主机 B 的条件更新成功获取了 "Moe" 的锁,应用程序得以继续运行!

官方文档

aws.amazon.com/blogs/datab...

相关推荐
Surpass余sheng军3 小时前
AI 时代下的网关技术选型
人工智能·经验分享·分布式·后端·学习·架构
可观测性用观测云3 小时前
AWS Lambda Python 链路可观测最佳实践
aws
哈哈哈笑什么6 小时前
企业级高并发分布式SpringCloud系统下,订单动态超时自动取消(最终成熟方案),使用spring-cloud-starter-stream-rabbit
分布式·spring cloud·rabbitmq
哈哈哈笑什么6 小时前
Sleuth+Zipkin 与 OpenSearch 结合是企业级分布式高并发系统的“王炸组合”
分布式·后端·spring cloud
哈哈哈笑什么8 小时前
在高并发分布式SpringCloud系统中,什么时候时候并行查询,提高查询接口效率,从10s到100ms
java·分布式·后端
阿杰同学10 小时前
Hadoop 面试题及答案整理,最新面试题
大数据·hadoop·分布式
听风吟丶11 小时前
微服务分布式事务实战:从数据一致性到故障恢复全方案
分布式·微服务·架构
ClouGence12 小时前
从 0 到 1 构建 TDSQL MySQL 实时同步链路
数据库·分布式·sql·mysql
哈哈哈笑什么12 小时前
完整Redis分布式锁技术方案(基于Redisson)
redis·分布式·spring cloud
树下水月13 小时前
kafka的topic积压的问题汇总
分布式·kafka