1 概述
分布式锁是控制分布式系统之间同步访问共享资源的一种方式,主要解决分布式系统的一致性问题。
2 实现原理
分布式锁主要基于具备全局原子性的信号发号机实现。
3 实现方式
目前,业内较为通用的方式主要包括基于Redis与ZooKeeper的实现。
3.1 基于Redis
Redis是基于内存、采用单进程单线程模型的KV数据库。
基于Redis setnx expire可实现一个较为通用的分布式锁。
3.2 基于ZooKeeper
基于ZooKeeper连续临时节点的特性,可实现分布式锁。
4 优化方式
基于Redis与ZooKeeper的实现方式,可以解决绝大部分问题。
4.1 问题描述
但是,在并发场景下,由于以下原因不合理,会导致分布式锁的并发模型失效。
① 超时时间设置不合理
② 事务执行过程较长
③ GC问题
问题描述
4.2 解决方法
基于以上问题,需要对数据的最终状态进行校验,主要的实现方式包括:
4.2.1 全局唯一Id
每次获取的分布式锁加入版本,例如全局唯一Id,如下图所示。
4.2.2 hash chain
① 设计
数据存储问题,采用hash chain的方式
a. DB中新增两个字段current_hash_value与last_hash_value,并设置为唯一索引
b. 参与hash计算的字段包括current_timestamp字段,保证当前冲突时,下一秒可以最大限度的避免hash冲突
② 工作原理
参考比特币的原理
a. 第一行的current_hash_value与last_hash_value相同,为初始化数据
b. 同一类数据的第二行的current_hash_value与同类上一条的last_hash_value相同,并采用唯一索引,保证并发问题数据的一致性
c. 数据的新增、删除全部采用Append的模式,既保留了历史数据,也保证了数据的一致性计算
③ 存在的问题
a. 客户端需要存储last_hash_value
b. 服务端接收请求后,如果发现没有last_hash_value,需要重新获取一次,增加系统开销
参考资料
1. https://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81/10459578?fr=aladdin
2. https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html