-
分布式锁:
在分布式服务中,如果各个服务之间需要去竞争资源,没办法使用单机多线程中JDK自带的锁,谷此时需要分布式锁来协调。
-
分布式锁实现的手段:
zookeeper、redis、memcache
-
分布式锁的实现原理
zookeeper:去创建相应的节点,创建成功,则表示获取到了相应的锁;创建失败,则表示获取锁失败,释放锁的时候,删除该节点即可。
redis、memecache:设置对应的值作为锁的标志,每次获取锁的时候先判断对应的值是否存在,存在则无法获取,不存在则设置相应的值,表示获取到锁(redis使用setnx设置值,memecache使用add)。
-
zookeeper实现分布式锁的方式:
- 程序连上zookeeper之后,就尝试去创建节点,如果创建成功则成功获取到锁。如果节点已经存在,则获取锁失败,程序进行短暂的休眠之后重试。释放锁的时候,删除该节点即可。缺点:消耗资源(会导致空轮转)
- 使用zookeeper的watcher机制,不需要等待的线程进行空轮转, 但是会引发羊群效应(在释放锁后,会唤醒一大批正在等待的线程)
- 创建有序的节点,下一个节点监控上一个节点,当上一个节点被释放的时候,就会唤醒下一个节点上等待的线程,达到每次只唤醒一个线程的目的。
-
注意事项:创建节点的时候,一定要创建临时节点(创建一个临时节点后,当session断开的时候会自动删除该节点,防治宕机后资源无法释放的问题)
zookeeper中分布式锁的实现方式
最新推荐文章于 2024-08-20 21:48:13 发布