Curator实现分布式锁的基本原理-getTheLock
// From StandardLockInternalsDriver
public PredicateResults getsTheLock(CuratorFramework client, List<String> children, String sequenceNodeName, int maxLeases) throws Exception{ // 之前创建的临时顺序节点在排序后的子节点列表中的索引 int ourIndex = children.indexOf(sequenceNodeName); // 校验之前创建的临时顺序节点是否有效 validateOurIndex(sequenceNodeName, ourIndex); // 锁公平性的核心逻辑 // 由InterProcessMutex的构造函数可知,maxLeases为1,即只有ourIndex为0时,线程才能持有锁,或者说该线程创建的临时顺序节点激活了锁 // Zookeeper的临时顺序节点特性能保证跨多个JVM的线程并发创建节点时的顺序性,越早创建临时顺序节点成功的线程会更早地激活锁或获得锁 boolean getsTheLock = ourIndex < maxLeases; // 如果已经获得了锁,则无需监听任何节点,否则需要监听上一顺序节点(ourIndex-1) // 因为锁是公平的,因此无需监听除了(ourIndex-1)以外的所有节点,这是为了减少羊群效应,非常巧妙的设计!! String pathToWatch = getsTheLock ? null : children.get(ourIndex - maxLeases); // 返回获取锁的结果,交由上层继续处理(添加监听等操作) return new PredicateResults(pathToWatch, getsTheLock);
} static void validateOurIndex(String sequenceNodeName, int ourIndex) throws KeeperException{ if ( ourIndex < 0 ){ // 容错处理,可跳过 // 由于会话过期或连接丢失等原因,该线程创建的临时顺序节点被Zookeeper服务端删除,往外抛出NoNodeException // 如果在重试策略允许范围内,则进行重新尝试获取锁,这会重新重新生成临时顺序节点 // 佩服Curator的作者将边界条件考虑得如此周到! throw new KeeperException.NoNodeException("Sequential path not found: " + sequenceNodeName); }
}
Curator实现分布式锁的基本原理-getTheLock相关推荐
- Curator实现分布式锁的基本原理
curator是Netflix公司开源的一个ZooKeeper客户端封装.curator 对于锁这块做了一些封装,curator 提供了InterProcessMutex 这样一个 api.除了分布式 ...
- Curator实现分布式锁的基本原理-LockInternals.internalLockLoop
// 循环等待来激活分布式锁,实现锁的公平性 private boolean internalLockLoop(long startMillis, Long millisToWait, String ...
- Curator实现分布式锁的基本原理-createsTheLock
// From StandardLockInternalsDriver // 在Zookeeper中创建临时顺序节点 public String createsTheLock(CuratorFrame ...
- Curator实现分布式锁的基本原理-LockInternals.attemptLock
// 尝试获取锁,并返回锁对应的Zookeeper临时顺序节点的路径 String attemptLock(long time, TimeUnit unit, byte[] lockNodeBytes ...
- Curator实现分布式锁的基本原理-InterProcessMutex.internalLock
private boolean internalLock(long time, TimeUnit unit) throws Exception{ Thread currentThread = Thre ...
- Curator实现分布式锁的基本原理-构造函数
// 最常用 public InterProcessMutex(CuratorFramework client, String path){// Zookeeper利用path创建临时顺序节点,实现公 ...
- Curator实现分布式锁的基本原理-InterProcessMutex.acquire
// 无限等待 public void acquire() throws Exception{ if ( !internalLock(-1, null) ){ throw new IOExceptio ...
- 分布式架构-ZK客户端工具Curator框架分布式锁及基本使用
分布式架构-基于Curator分布式锁及基本使用 一.Curator Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作 ...
- Apache Curator之分布式锁原理(二)
本文主要讲解如下内容: 为什么要使用分布式锁? 分布式锁特性! 分布式锁的实现方式有哪些? Curator分布式锁原理 Curator分布式锁实现类UML及相关类的介绍 基于Redis,数据库实现分布 ...
最新文章
- 云原生中间件与开源自建TCO对比
- python saltstack web_saltstack学习-8:web管理页面(halite)
- vue-router嵌套路由,默认子路由设置
- C++/C--unordered_map常见用法详解
- oracle数据库关不掉,oracle进程关不掉的问题??新手问题
- rabbitMq消息不可达returnListener的使用
- 笔记本计算机属于微型计算机吗,微型计算机和笔记本计算机有什么区别
- python之求字典最值
- 科技界流传的 OKR 系统有用吗?
- 面向对象(Python):学习笔记之单例模式
- 给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度
- java spring boot 项目 热加载 有利于快速开发
- spring---FactoryBean与BeanFactory的区别
- 深度装机大师一键重装_正确重装系统(1):一键重装系统出现问题解决方法...
- 创建最基本的GD32F4xx的工程
- 10的多少次方 oracle_Oracle SQL計算平方根、立方根、次方
- FastFDS文件服务部署
- UG NX 12 抽取面特征
- 数据分析在网络营销中的意义有哪些
- access 数据库写按日期查询SQL