临时节点什么时候消失?客户端被杀、服务端重启、会话正常关闭,三种情形差别很大,也是做服务发现、分布式锁时最需要弄清的行为。这篇逐一量出来,最后看 TTL 节点与容器节点两种较新的节点类型。
/persist ephemeralOwner = 0x0 /eph ephemeralOwner = 0x1000bb81ee50000 创建者会话 id = 0x1000bb81ee50000 相等: True create /eph/child → NoChildrenForEphemeralsError
close() 之后到节点消失:4 ms 客户端进程被 kill -9 之后立即查询: eph-kill 还在 从进程被杀到节点消失:6718 ms(会话超时 6000 ms)
这就是服务发现里「实例挂了多久会被摘除」的答案:取决于会话超时(第 13 篇),不是 TCP 断开的时间。
服务端重启后 /eph-restart 还在: True | 同一个会话 id: True
[zk] create -t 2000 /ttl1 x → Created /ttl1 轮询看到 /ttl1 存在了 2029 ms(TTL = 2000 ms,容器检查间隔被我设成 300 ms) [zk] create -c /cont → Created /cont | create -c /cont/child x → Created /cont/child 容器节点 /cont 在删掉最后一个子节点 245 ms 后被自动删除 没有 extendedTypesEnabled 的另一个节点上 create -t 1000 /x → KeeperErrorCode = Unimplemented for /x
这两种节点由服务端的 ContainerManager 定期清理,清理间隔默认 60 秒(本实验把它调成 300 ms 才能观察),所以实际的消失时间会比 TTL 长一个检查周期。