我正在开发一个使用 ZooKeeper 作为数据存储的应用程序。对于应用程序中的一种方法,我需要使用乐观并发控制。例如,我需要实现一个获取 znode 数据的 get 方法,并且我使用 znode 数据版本进行乐观并发控制检查。据我了解,一次操作无法获取 znode 数据和 znode 数据版本。如果更新 znode 数据的竞争激烈,get 方法将不起作用,因为在获取 znode 数据后 znode 数据可能会发生变化。所以我在问 -有没有一种方法可以在一次操作中获得 znode 数据和 znode 数据版本(或 znode stat),而在两者之间没有任何锁定尝试?
问问题
2471 次
2 回答
9
在Java中,您可以轻松实现您想要的:
Stat stat = new Stat();
byte[] data = zk.getData("/path", null, stat));
stat
这确实在单个操作中读取数据和版本信息(在对象中)。当您写回数据时,您会传递您在读取数据时获得的版本号:
zk.setData("/path", data, stat.getVersion());
如果版本不匹配,该方法将抛出KeeperException.BadVersionException
,这会给您一个乐观锁。
于 2013-10-28T14:07:20.040 回答
0
在使用 Kazoo 的 Python 中,获取统计信息并实现一些光学锁定也很简单。这里有一个草图:
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
此外,尽可能使用预制配方,因为它们已经经过广泛调试,并且应该处理所有极端情况。
于 2013-11-27T19:59:59.723 回答