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

时间:2013-07-31 23:14:57

标签: apache-zookeeper optimistic-locking optimistic-concurrency optimistic

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

2 个答案:

答案 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

此外,尽可能使用预先制作的食谱,因为它们已被广泛调配,并且应该处理所有角落情况。