5

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

4

2 回答 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 回答