我正在开发一个使用ZooKeeper作为数据存储区的应用程序。对于应用程序中的一个方法,我需要使用乐观并发控件。例如,我需要实现一个获取znode数据的get方法,并使用znode数据版本进行乐观并发控制检查。据我所知,无法在一次操作中获取znode数据和znode数据版本。如果存在更高争用更新znode数据,则get方法将无法工作,因为获取znode数据后znode数据可能会更改。所以我问 - 有没有一种方法可以在一次操作中获得znode数据和znode数据版本(或znode stat)而不会在其间进行任何锁定尝试?
答案 0 :(得分:6)
在Java中,您可以轻松实现您想要的目标:
Stat stat = new Stat();
byte[] data = zk.getData("/path", null, stat));
这会在单个操作中读取数据和版本信息(在stat
对象中)。当您回写数据时,您会传递读取时获得的版本号:
zk.setData("/path", data, stat.getVersion());
如果版本不匹配,该方法将抛出KeeperException.BadVersionException
,这会给您一个乐观的锁定。
答案 1 :(得分: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
此外,尽可能使用预先制作的食谱,因为它们已被广泛调配,并且应该处理所有角落情况。