Zookeeper手表documentation states:
“在查看与该znode对应的新数据之前,客户端将看到它正在观看的znode的监视事件。”此外,“因为手表是一次触发,并且在获取事件和发送新请求以获取手表之间存在延迟,因此您无法可靠地看到ZooKeeper中节点发生的每个更改。”
关键是,无法保证您会收到观看通知。
这很重要,因为在像Clojure Avout这样的系统中,你试图通过网络使用Software Transactional Memory来模仿Clojure的Zookeeper。这取决于每次更改都有手表通知。
现在我正在尝试研究这是一个编码缺陷,还是一个基本的计算机科学问题(即CAP Theorem)。
我的问题是: Zookeeper手表系统是否有错误,或者这是CAP定理的限制?
答案 0 :(得分:1)
这似乎是ZooKeeper实现手表的方式的限制,而不是CAP定理的限制。有一个开放功能请求可以向ZooKeeper添加连续监视:https://issues.apache.org/jira/browse/ZOOKEEPER-1416。
etcd有一个使用长轮询的watch函数。您需要考虑的限制是在接收第一个长轮询结果和重新轮询之间可能发生多个事件。这大致类似于ZooKeeper的问题。但他们有一个解决方案:
但是,watch命令可以做更多的事情。使用索引[传递我们见过的最后一个索引],我们可以查看过去发生过的命令。这对于确保您不会错过监视命令之间的事件非常有用。
curl -L 'http://127.0.0.1:4001/v2/keys/foo?wait=true&waitIndex=7'