ZooKeeper写事件与出发watcher的对应关系

下面表格列出了写操作与ZK内部产生的事件的对应关系:

event For "/path" event For "/path/child"
create("/path") EventType.NodeCreated NA
delete("/path") EventType.NodeDeleted NA
setData("/path") EventType.NodeDataChanged NA
create("/path/child") EventType.NodeChildrenChanged EventType.NodeCreated
delete("/path/child") EventType.NodeChildrenChanged EventType.NodeDeleted
setData("/path/child") NA EventType.NodeDataChanged

而ZK内部的写事件与所触发的watcher的对应关系如下:

event For "/path" defaultWatcher exists
("/path")
getData
("/path")
getChildren
("/path")
EventType.None
EventType.NodeCreated
EventType.NodeDeleted √(不正常)
EventType.NodeDataChanged
EventType.NodeChildrenChanged

综合上面两个表,我们可以总结出各种写操作可以触发哪些watcher,如下表所示:

"/path" "/path/child"
exists getData getChildren exists getData getChildren
create("/path")
delete("/path")
setData("/path")
create("/path/child")
delete("/path/child")
setData("/path/child")

如果发生session close、authFail和invalid,那么所有类型的wather都会被触发

zkClient除了做了一些便捷包装之外,对watcher使用做了一点增强。比如subscribeChildChanges实际上是通过exists和getChildren关注了两个事件。这样当create("/path")时,对应path上通过getChildren注册的listener也会被调用。另外subscribeDataChanges实际上只是通过exists注册了事件。因为从上表可以看到,对于一个更新,通过exists和getData注册的watcher要么都会触发,要么都不会触发。

zkClient地址:https://github.com/sgroschupf/zkclient

你可能感兴趣的:(zookeeper,zkclient)