1

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

回答

5

在Java中,你可以可以实现你想要什么轻松:

Stat stat = new Stat(); 
byte[] data = zk.getData("/path", null, stat)); 

这确实在一次操作中读取数据和版本信息(在stat对象)。当你写回的数据,你通过你得到的版本号,当你阅读:

zk.setData("/path", data, stat.getVersion()); 

如果有一个版本不匹配,该方法将抛出KeeperException.BadVersionException,它给你一个乐观锁。

+0

我使用的是Curator 2.8.0,这已被重构为 Stat stat = new Stat(); c.getData().storageStatIn(stat).forPath(“/ path”); – matsa

0

在使用Kazoo的Python中,获取两个统计信息并实现一些optmistic锁定也是微不足道的。这里草图:

while True: 
    data, stat = zk.get("/path") 
    # do something with the data and then: 
    try: 
     zk.set("/path", new_data, stat.version) 
     break 
    except BadVersionError: 
     continue # or pass 

而且,你什么时候可以使用预先制作的食谱,因为它们已经广泛debuged,而且应该把所有角落的情况。

相关问题