Zookeeper实现分布式锁
Zookeeper的数据结构是文件系统
Zookeeper的节点类型
- 持久化节点:一旦创建、永久存在
- 临时节点:session超时,会被服务器剔除
- 持久化顺序节点:持久化节点的基础上,自带顺序
- 临时顺序节点:临时节点的基础上,自带顺序
- 容器节点:当没有子节点时,未来会被服务器剔除
- TTL节点:过了TTL指定的时间内,被服务器剔除
其中我们需要的就是:
- 容器节点:就相当于锁????,当容器节点下没有子节点时,说明没有线程申请锁,容器节点自动删除
- 临时顺序节点:每个请求被存储为一个临时顺序节点
临时节点
监听机制
集群监听机制
分布式锁实现1(见下图)
弊端:
如果1000个请求来,第一个请求创建了临时节点,拿到了锁,执行相关逻辑,剩下的999个请求开始监听,一旦第一个线程释放了锁,其他999个请求开始重新执行获取锁的逻辑,但只能有一个拿到锁,这是不是很耗费资源?
我们想的就是如果有个队列能够将请求存起来,逐个执行,是不是就会减少资源耗费了?
这就是为啥Zookeeper是个实现分布式锁的坯子了,因为它自己独有的监听机制。
分布式锁实现二(最优方案)