ZooKeeper可以在一次操作中获取znode数据和znode数据版本(stat)吗?

jed*_*006 2 optimistic optimistic-locking optimistic-concurrency apache-zookeeper

我正在开发一个使用ZooKeeper作为数据存储区的应用程序.对于应用程序中的一个方法,我需要使用乐观并发控件.例如,我需要实现一个获取znode数据的get方法,并使用znode数据版本进行乐观并发控制检查.据我所知,无法在一次操作中获取znode数据和znode数据版本.如果存在更高争用更新znode数据,则get方法将无法工作,因为获取znode数据后znode数据可能会更改.所以我问 - 有没有一种方法可以在一次操作中获得znode数据和znode数据版本(或znode stat)而不会在其间进行任何锁定尝试?

thi*_*ibr 6

在Java中,您可以轻松实现您想要的目标:

Stat stat = new Stat();
byte[] data = zk.getData("/path", null, stat));
Run Code Online (Sandbox Code Playgroud)

这确实stat在单个操作中读取(在对象中)数据和版本信息.当您回写数据时,您会传递读取时获得的版本号:

zk.setData("/path", data, stat.getVersion());
Run Code Online (Sandbox Code Playgroud)

如果存在版本不匹配,则该方法将抛出KeeperException.BadVersionException,这将为您提供乐观锁定.