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

Posted

技术标签:

【中文标题】ZooKeeper 可以在一次操作中获取 znode 数据和 znode 数据版本(stat)吗?【英文标题】:can ZooKeeper get znode data and znode data version (stat) in one single operation? 【发布时间】:2013-08-01 16:48:18 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

这确实在单个操作中读取数据和版本信息(在stat 对象中)。当你写回数据时,你传递的是你读取它时得到的版本号:

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

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

【讨论】:

我正在使用 Curator 2.8.0,它已被重构为 Stat stat = new Stat(); c.getData().storingStatIn(stat).forPath("/path");【参考方案2】:

在使用 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

此外,请尽可能使用预制配方,因为它们已经经过广泛调试,并且应该处理所有极端情况。

【讨论】:

以上是关于ZooKeeper 可以在一次操作中获取 znode 数据和 znode 数据版本(stat)吗?的主要内容,如果未能解决你的问题,请参考以下文章

Instagram Basic API:是不是可以在一次查询中从“CAROUSEL_ALBUM”获取 media_url?

如何获取zookeeper上的信息

Zookeeper 服务器在一段时间后关闭

REST api:在一次获取中请求多个资源[重复]

我可以使用 multer 来调整图像大小并在一次操作中保存到磁盘吗?

ZooKeeper的安装