美文网首页
关于分布式锁的一些思考

关于分布式锁的一些思考

作者: 鉄木杉 | 来源:发表于2017-07-28 17:31 被阅读0次

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

相关文章

网友评论

      本文标题:关于分布式锁的一些思考

      本文链接:https://www.haomeiwen.com/subject/ujsflxtx.html