简单基于Zookeeper实现分布式锁8-11

一.分布式锁有那些应用场景

1. 集群环境中保证定时任务执行的幂等性问题

基于zk案例
幂等性:执行结果保证唯一不能够重复。

当我们定时任务服务集群的情况下,有可能会同时重复执行定时任务。

解决思路:
多个jvm集群的定时任务 在触发的时候,获取分布式锁
如果能够获取到分布式锁的jvm,就能够执行定时任务,没有获取到
分布式锁的jvm就不能够执行定时任务。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 用户下单库存超卖的问题,防止超卖 Redis解决

二、Synchronized锁与分布式锁区别

Synchronized锁适合于单个jvm中保证线程安全问题

分布式锁适合于多个jvm之间跨网络通讯方式实现分布式锁

在这里插入图片描述

三、Zookeeper作用

服务注册与订阅(共用节点)
分布式通知(监听znode)分布式配置中心
服务命名(znode特性)
数据订阅、发布(watcher)
分布式锁(临时节点)

四、Zookeeper节点类型

持久化节点(zk断开节点还在)
持久化顺序编号目录节点
临时目录节点(客户端断开后节点就删除了)
临时目录编号目录节点
Watch 当节点的内容发生变化的时候 可以实现通知给其他监听者。

五、临时与持久节点区别:

临时节点当我们断开连接之后,该临时节点自动被删除。
持久节点当我们断开连接之后,持久化存放在硬盘中。

六、Zookeeper实现分布式锁原理

1.Zookeeper实现分布式锁原理:

Zookeeper节点路径不能重复 保证唯一性。
临时节点+事件通知

2.获取锁方法:

多个jvm同时zk创建一个临时节点/lockPath,最终只能够有一个jvm创建临时节点成功,如果能够创建临时节点成功jvm 表示获取锁成功能够正常执行业务逻辑,如果没有创建临时节点成功的jvm,则表示获取锁失败。
获取锁失败之后,可以采用不断重试策略,重试多次获取锁失败之后,当前的jvm就进入到阻塞状态。

3.释放锁方法:

直接调用.close();释放锁
因为采用临时节点,当我们调用close()方法的时候
该临时节点会自动被删除。
其他没有获取到锁的jvm,就会从新进入到获取锁的状态。

3.被唤醒的方法:

被阻塞的jvm(没有获取锁成功的jvm),采用事件监听的方式
监听到节点已经被删除的情况下,则开始从新进入到获取锁的状态。

七、Zookeeper常见的问题

创建的是一个临时节点,主动调用close该临时节点会立即删除
强制直接关闭tomcat jvm进程 临时节点不会立马被删除 延迟

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值