2

Zookeeper Watches文档指出

“客户端将在看到与该 znode 对应的新数据之前看到它正在观察的 znode 的观察事件。” 此外,“因为 watch 是一次性触发器,并且在获取事件和发送新请求以获取 watch 之间存在延迟,因此您无法可靠地看到 ZooKeeper 中节点发生的每一个变化。”

关键是,不能保证您会收到观看通知。

这很重要,因为在像 Clojure 的Avout这样的系统中,您正在尝试使用Zookeeper在网络上模仿 Clojure 的软件事务内存。这依赖于每次更改都有一个监视通知。

现在我正在尝试确定这是一个编码缺陷,还是一个基本的计算机科学问题,(即CAP 定理)。

我的问题是:Zookeeper Watches 系统是否存在错误,或者这是 CAP 定理的限制?

4

1 回答 1

1

这似乎是 ZooKeeper 实现 watch 方式的限制,而不是 CAP 定理的限制。有一个向 ZooKeeper 添加持续监视的开放功能请求:https ://issues.apache.org/jira/browse/ZOOKEEPER-1416 。

etcd 有一个使用长轮询的监视功能。您需要考虑的限制是在接收第一个长轮询结果和重新轮询之间可能会发生多个事件。这大致类似于 ZooKeeper 的问题。但是他们有一个解决方案:

但是,watch 命令可以做的远不止这些。使用索引 [通过我们看到的最后一个索引],我们可以观察过去发生的命令。这对于确保您不会错过 watch 命令之间的事件很有用。

curl -L 'http://127.0.0.1:4001/v2/keys/foo?wait=true&waitIndex=7'
于 2015-06-21T23:21:52.803 回答