一.分布式锁有那些应用场景
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进程 临时节点不会立马被删除 延迟
。