持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
watcherAPI
curator提供了两种Watcher(Cache)来监听结点的变化:
- Node Cache : 只是监听某一个特定的节点,监听节点的新增和修改
- PathChildren Cache : 监控一个ZNode的子节点. 当一个子节点增加, 更新,删除 时, Path Cache会改变它的状态, 会包含最新的子节点, 子节点的数据和状态
client = ...(连接代码)
NodeCache nodeCache=new NodeCache(client,"/watcher");
nodeCache.start();
nodeCache.getListenable().addListener(new NodeCacheListener() {
public void nodeChanged() throws Exception {
......
}
});
new NodeCache(arg1,arg2) :arg1:连接对象、arg2:监视节点的路径
nodeCache.start(): 启动监视器对象
addListener(): 节点变化时的回调方法
另外也可以定义监视子节点的方法,不同的地方是:
PathChildrenCache pathChildrenCache=new PathChildrenCache(client,"/watcher",true);
其中第三个参数用于设置事件中是否可以获取节点的数据
zookeeper事务
client = ...(连接代码)
client.inTransaction()
.create().forPath("node1", "abc".getBytes())
.and()
.create().forPath("node2", "def".getBytes())
.and()
.commit();
将两次创建节点合并为了一个原子操作,只有都创建成功后事务才会提交,否则会回滚,两个节点都不会创建成功
分布式锁
首先zookeeper实现分布式锁有两种类型,一种是排它锁,另一种是读写锁。
- InterProcessMutex:分布式可重入排它锁
- InterProcessReadWriteLock:分布式读写锁
定义并获取排它锁:
client = ...(连接代码)
InterProcessLock interProcessLock = new InterProcessMutex(client,"/lock");
interProcessLock.acquire();
...
interProcessLock.release();
代码释义: new InterProcessMutex(arg1,arg2) : 定义排它锁
interProcessLock.acquire() : 获取排它锁
interProcessLock.release() : 释放排它锁
定义并获取读锁:
client = ...(连接代码)
InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client,"/lock");
InterProcessLock interProcessLock=lock.readLock();
interProcessLock.acquire();
...
interProcessLock.release();
代码释义: new InterProcessReadWriteLock: 定义读写锁
lock.readLock(): 获取读锁对象
interProcessLock.acquire() :获取读锁
interProcessLock.release() : 释放读锁
定义并获取写锁:
client = ...(连接代码)
InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client,"/lock");
InterProcessLock interProcessLock=lock.writeLock();
interProcessLock.acquire();
...
interProcessLock.release();
代码释义: new InterProcessReadWriteLock: 定义读写锁
lock.writeLock(): 获取写锁对象
interProcessLock.acquire() :获取读锁
interProcessLock.release() : 释放读锁