关于分布式锁的一些思考

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 问题导读: 1.如何构建高并发电商平台架构 2.哈希、B树、倒排、bitmap的作用是什么? 3.作为软件工程师,...
    MaLiang阅读 5,156评论 1 70
  • 从各个角度总结了电商平台中的架构实践,由于时间仓促,定了个初稿,待补充完善,欢迎大家一起交流。 转载请声明出处:h...
    Maggie编程去阅读 1,598评论 0 9
  • 【有发现】 突然发觉自己受少华的影响了 这对话都询问方式了 与之前的我有些区别啊! 当遇到问题我束手无策时 会学着...
    0ALA0阅读 147评论 0 0
  • 连续两晚梦见他了 暗恋三年说实话也该都过去了 他现在过的很好我也还不错 只是可惜喜欢到命里的人怎么就一点都不喜欢我...
    金鱼妹妹哟阅读 239评论 0 0