zookeeper-watcher、事务、分布式锁的API使用

85 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

watcherAPI

curator提供了两种Watcher(Cache)来监听结点的变化:

  1. Node Cache : 只是监听某一个特定的节点,监听节点的新增和修改
  2. 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实现分布式锁有两种类型,一种是排它锁,另一种是读写锁。

  1. InterProcessMutex:分布式可重入排它锁
  2. 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() : 释放读锁