1. 分布式锁设计思路
分布式锁与JVM中Sychroniced/ReentrantLock等使用一次。其本质是基于ZK创建节点的有序性
其设计思路如下
zk1.png
2.分布式信号量设计思路
分布式信号量与JVM中信号量(Semaphore)使用一致,维护一组许可,需要使用时候进行申请,申请成功获取许可,申请失败阻塞或等待,使用完需要归还许可,保证信号量的许可数稳定。
2.1 实现原理
分布式信号量将许可的获取分为两部分,
- 获取Lock
- 获取Lease
分布式信号量中每个许可通常称为Lease
zk2.png本质上,分布式信号量的实现锁基于分布式锁。
2.2 举例
Max Lease= 2, 有客户端 A B C去获取信号量。
- 假设A获取Lock,则可以通过Lease操作流程获取第一个Lease,此时该Lease Path下Node个数为1,小于Max Lease, A获取Lease, A删除Lock path下临时节点
- 假设B尝试获取,假设此时A还在创建Lease,则B wait,一直等到A删除Lock Path 下节点,则B获取Lease, Lease Path下节点数为2,等于Max Lease, B获取Lease, B删除lock Path下临时节点
- 执行2类似操作,假设成功获取Lock (lock 节点容易获取,只需要前面的线程成功获取Lease即可),此时 Lease Pat下节点数为3,超过Max Lease,C执行重试,直到超时或A/B执行完业务逻辑,删除掉Lease Path下的Node为止
3. 总结
通过以上两种思路可实现分布式锁及分布式信号量,Curator有两种方案实现方式,具体实现细节可以参考本空间其他文章。