分布式-Zookeeper-分布式锁

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 分布式-Zookeeper-分布式锁

分布式锁的由来:

其实:分布式锁的原理和jdk中提供的自旋锁,偏向锁,公平锁/非公平锁,同步锁的原理是一样的。但是jvm中的锁只针对一个jvm有效。如果是在多JVM上执行共享资源操作的时候,这个jdk中的锁就失效了,这时候的锁不能锁住每个jvm,多个jvm就相当于多个java虚拟机了操作共享资源,这时就应该使用分布式锁。举个例子:以秒杀为例:相当于每台机子上部署了相同的程序去执行对共享资源操作。三台机器同时去抢商品10件,谁先获得到时间片,谁就先执行count--。可能第二,三台机器拿到的是10,这时商品总数为9,第一台拿到是9,这时商品总数为8,现在三个人都抢购完了,第一个人却拿到了9。明明是三个人抢到了,商品数量却为8,肯定是不行的。所以这就是在多线程的情况可能导致数据不安全的问题,因为商品是共享资源。

解决:

①、如下图所示:在操作商品的时候不能去直接操作商品的数量,需要先拿到锁。一般为了效率问题,一般会用zk的分布式锁,因为分布式锁可以做集群。prod_lock是zk集群中的永久节点,下面是三个jvm。在同一个时间去抢在永久节点下面创建Lock节点。刚开始Lock节点是不存在的。

②、如下图所示:

谁创建成功了Lock节点,谁就可以操作商品的数量,比如A先创建了Lock节点,然后A就可以去操作商品,这时商品的数量减1为9。

③、然后A这个客户端将Lock节点给删掉。然后去通知B,C两个客户端。

B,C就马上去抢占Lock这个节点。谁先创建成功,谁就先获得到锁。


④、如果C创建了Lock节点,然后C拿到了锁,从而去操作商品。然后操作完又会去释放Lock,然后通知。

这里当每一个客户端释放Lock的时候,下一轮也会去抢锁。

上面的分布式锁是排它锁(X锁):当一个客户端获取到了锁之后,其他的客户端将处于一种阻塞的状态。

上面的锁是有问题的,比如当一个客户端拿到锁之后,不下单,这时锁就不会被释放,所有的客户端都会在等待,这时就会成为死锁的状态。

针对上面的问题:解决方案如下:

A、可以加一个过期的时间,如果超过了规定的时间内,还没有删除的话,可以定义一个定时器去删除这个节点。

B、创建的节点为临时节点,超过了有效的时间,它会自动的断开,那么会话将会被结束,会话结束,临时节点将自动删除掉,一旦干掉,这里又可以竞争锁了。

排它锁的执行效率是不高的,针对小项目是可以够用的,针对大项目的话效率是低的因为比如说有100个客户端,其中有一个拿到了锁,剩下的99个客户端都在等。

2、实际项目中用的锁是共享锁:

①、这个Lock锁是共享的,任何的人都可以去拿它。不需要这个Lock删了才可以去拿,这个Lock不需要平凡的建和删,每一个客户端都可以拿到这个Lock锁,只要拿到了这个Lock节点,由于线程是无序的,就可以在Lock节点下面创建很多个临时顺序节点。

②、临时顺序节点会随着顺序的增加而增加,由于网速的原因,所以创建的节点不能按照1,2,3,4,5这样的顺序而排序 。这时需要对Lock节点下面的所有的子节点进行排序,比如从小到大的排序,然后筛选出最小的节点,然后最小的节点所对应的客户端获取到锁,这里是获得锁的时候就需要排序。

③、最小的节点获取到锁之后,会释放-Lock-0000021,从而释放锁。

方式1:然后没有获取到锁的所有的顺序节点将会订阅一个最小节点被删除的订阅事件。

这种方式是不可取的,假如说有100个客户端,这个时候将会最小的节点获取到锁,将会有99个节点将会收到通知,这时会引起网络阻塞或者锁故障。因为这些的节点也不知道自己是最小的,所以都会去尝试获得锁,所以99个节点将会同时去获得锁,这时就会出现网络故障。这就有点像经济学中的羊群效应。如果业务量非常小的话,用这种方法是可取的。

方式2:业务量比较大,集群比较大的话,客户端很大的情况下是不可取的。

解决办法:所有的临时顺序节点将监听比自己小的节点就可以了。小的节点删掉的话会通知下一个节点。每次获取锁的时候,执行完然后删除,然后再进行排序。-lock-00000021监听-lock-00000011,-lock-00000031监听-lock-0000021。这样就可以解决了大流量去获取到锁的情况。

共享锁更有效的减少了创建了锁的时间,效率会很高。

3、分布式锁的优化:

如果在创建临时顺序节点的时候会出现网络抖动(网络不稳定的情况)

由于网络不稳定导致节点15的会话断开,从而17的节点和11的节点从而同时拿到锁。这时会造成并发的问题。下面的图是解决方案:


革命尚未成功,继续努力!!!

相关文章
|
14天前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
7月前
|
NoSQL Java 中间件
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
本文介绍了从单机锁到分布式锁的演变,重点探讨了使用Redis实现分布式锁的方法。分布式锁用于控制分布式系统中多个实例对共享资源的同步访问,需满足互斥性、可重入性、锁超时防死锁和锁释放正确防误删等特性。文章通过具体示例展示了如何利用Redis的`setnx`命令实现加锁,并分析了简化版分布式锁存在的问题,如锁超时和误删。为了解决这些问题,文中提出了设置锁过期时间和在解锁前验证持有锁的线程身份的优化方案。最后指出,尽管当前设计已解决部分问题,但仍存在进一步优化的空间,将在后续章节继续探讨。
1038 131
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
|
4月前
|
Apache
分布式锁—7.Curator的分布式锁
本文详细解析了Apache Curator库中多种分布式锁的实现机制,包括可重入锁、非可重入锁、可重入读写锁、MultiLock和Semaphore。可重入锁通过InterProcessMutex实现,支持同一线程多次加锁,锁的获取和释放通过Zookeeper的临时顺序节点实现。非可重入锁InterProcessSemaphoreMutex基于Semaphore实现,确保同一时间只有一个线程获取锁。可重入读写锁InterProcessReadWriteLock通过组合读锁和写锁实现,支持读写分离。Multi
|
7月前
|
NoSQL Java 测试技术
【📕分布式锁通关指南 05】通过redisson实现分布式锁
本文介绍了如何使用Redisson框架在SpringBoot中实现分布式锁,简化了之前通过Redis手动实现分布式锁的复杂性和不完美之处。Redisson作为Redis的高性能客户端,封装了多种锁的实现,使得开发者只需关注业务逻辑。文中详细展示了引入依赖、配置Redisson客户端、实现扣减库存功能的代码示例,并通过JMeter压测验证了其正确性。后续篇章将深入解析Redisson锁实现的源码。
204 0
【📕分布式锁通关指南 05】通过redisson实现分布式锁
|
7月前
|
运维 NoSQL 算法
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
337 0
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
|
8月前
|
NoSQL 关系型数据库 MySQL
分布式系统学习9:分布式锁
本文介绍了分布式系统中分布式锁的概念、实现方式及其应用场景。分布式锁用于在多个独立的JVM进程间确保资源的互斥访问,具备互斥、高可用、可重入和超时机制等特点。文章详细讲解了三种常见的分布式锁实现方式:基于Redis、Zookeeper和关系型数据库(如MySQL)。其中,Redis适合高性能场景,推荐使用Redisson库;Zookeeper适用于对一致性要求较高的场景,建议基于Curator框架实现;而基于数据库的方式性能较低,实际开发中较少使用。此外,还探讨了乐观锁和悲观锁的区别及适用场景,并介绍了如何通过Lua脚本和Redis的`SET`命令实现原子操作,以及Redisson的自动续期机
914 7
|
9月前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
10月前
|
存储 运维 NoSQL
分布式读写锁的奥义:上古世代 ZooKeeper 的进击
本文作者将介绍女娲对社区 ZooKeeper 在分布式读写锁实践细节上的思考,希望帮助大家理解分布式读写锁背后的原理。
263 11
|
11月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
183 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
11月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
160 2

热门文章

最新文章