侧边栏壁纸
博主头像
清如许博主等级

努力成长为一颗大树,一半洒落阴凉,一半沐浴阳光,非常沉默非常骄傲,从不依靠从不寻找

  • 累计撰写 80 篇文章
  • 累计创建 44 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

A004-分布式锁-设计文档.md

清如许
2022-08-05 / 0 评论 / 0 点赞 / 7 阅读 / 827 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-08-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

| --- | --- | --- |
| 更新日期 | 2022年04月20日 | 作 者 | 张留杨 |
| 保密等级 | C | 开放范围 | 研发测试部 |

版本历史

版 本更新日期作 者备注
1.0.02022年04月20日张留杨新建文档

业务背景

在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用JVMsynchronized语法,或者使用JDKLock来保证,这实际上是本地锁的方式。但是现在公司都是分布式架构,在分布式环境下,如何保证不同节点的线程同步执行呢?实际上,对于分布式场景,我们可以使用分布式锁,它是控制分布式系统之间互斥访问共享资源的一种方式。
比如说在一个分布式系统中,多台机器上部署了多个服务,当客户端一个用户发起一个数据插入请求时,如果没有分布式锁机制保证,那么那多台机器上的多个服务可能进行并发插入操作,导致数据重复插入,对于某些不允许有多余数据的业务来说,这就会造成问题。而分布式锁机制就是为了解决类似这类问题,保证多个服务之间互斥的访问共享资源,如果一个服务抢占了分布式锁,其他服务没获取到锁,就不进行后续操作。
image.png

解决问题

主要解决bladex提供的分布式锁的一些问题,支持一些新特性,以及优化一些逻辑。

颗粒度

目前blade提供的分布式锁是基于aop代理的,锁的颗粒度为方法/参数级别。我们还需要更小的颗粒度,如行级别。

锁类型

目前提供了两种锁类型,公平锁、可重入锁。还需要比如:读锁、写锁。

失败策略

目前没有提供比如:加锁超时策略、锁释放超时策略

全局配置

提供一些全局配置,比如:全局锁超时、释放时间

设计目标

分布式锁一般有如下的特点:

  • 互斥性: 同一时刻只能有一个线程持有锁
  • 可重入性: 同一节点上的同一个线程如果获取了锁之后能够再次获取锁
  • 锁超时:和J.U.C中的锁一样支持锁超时,防止死锁
  • 高性能和高可用: 加锁和解锁需要高效,同时也需要保证高可用,防止分布式锁失效
  • 具备阻塞和非阻塞性:能够及时从阻塞状态中被唤醒

实现方式

https://redis.io/docs/reference/patterns/distributed-locks/
基于Redisson3.17.0

�支持功能

服务器类型

  • 单点
  • 集群
  • 哨兵
  • 主从

锁类型

  • 可重入锁(默认)
  • 公平锁
  • 读锁
  • 写锁

锁颗粒度

  • 方法级别
  • 参数级别
  • 行代码级别

使用方式

  • 声明式
  • 编程式

工作模式

声明式

image.png

编程式

image.png

0

评论区