Watcher 是 ZooKeeper 最有特色的功能,也是最容易理解错的:谁能触发它?事件里有什么?触发后还有效吗?这篇做一个触发矩阵,每一种「注册 + 操作」组合都真实执行一遍。
get(/m/a, watch) 然后 set /m/a → [('data', 'CHANGED', '/m/a')]
get(/m/a2, watch) 然后 delete /m/a2 → [('data', 'DELETED', '/m/a2')]
exists(/m/b, watch) 然后 create /m/b → [('exists', 'CREATED', '/m/b')]
exists(/m/b, watch) 然后 set /m/b → [('exists', 'CHANGED', '/m/b')]
get_children(/m/p1, watch) 然后 create /m/p1/c → [('child', 'CHILD', '/m/p1')]
get_children(/m/p1, watch) 然后 set /m/p1/c → 没有事件
get_children(/m/p2, watch) 然后 delete /m/p2/c → [('child', 'CHILD', '/m/p2')]
get_children(/m/p3, watch) 然后 delete /m/p3 本身 → [('child', 'DELETED', '/m/p3')]
get(/m/q, watch) 然后 create /m/q/c(父节点数据 watch) → 没有事件kazoo 里 watch 的事件类型叫 CHANGED / DELETED / CREATED / CHILD,对应 Java 客户端的 NodeDataChanged / NodeDeleted / NodeCreated / NodeChildrenChanged。
事件对象的字段: {'type': 'CHANGED', 'state': 'CONNECTED', 'path': '/n'} | 有数据字段吗: False
事件之后再 get(/n) 拿到: b'v2'连续 3 次 set 之后收到的事件数: 1 ['CHANGED']