基于 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...

相关推荐
一路向北North5 小时前
使用reactor-rabbitmq库监听Rabbitmq
分布式·rabbitmq·ruby
Amy1870211182310 小时前
赋能低压分布式光伏“四可”建设,筑牢电网安全新防线
分布式
sealaugh3213 小时前
aws(学习笔记第四十八课) appsync-graphql-dynamodb
笔记·学习·aws
June bug14 小时前
【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
经验分享·分布式·职场和发展·架构·学习方法·测试·软考
阿波罗.201215 小时前
Zookeeper 客户端 .net访问框架 ZookeeperNetEx项目开发编译
分布式·zookeeper
Bug退退退12316 小时前
RabbitMQ 工作模式
java·分布式·rabbitmq
weixin_4383354016 小时前
分布式锁实现方式:基于Redis的分布式锁实现(Spring Boot + Redis)
数据库·redis·分布式
危险、21 小时前
RabbitMQ 通过HTTP API删除队列命令
分布式·http·rabbitmq
周某某~21 小时前
windows安装RabbitMQ
分布式·rabbitmq
Bug退退退12321 小时前
RabbitMQ 高级特性之消息确认
java·分布式·rabbitmq