顺序节点(SEQUENTIAL)是 ZooKeeper 实现锁、队列、选举的核心零件。它的序号到底怎么来的?删除之后会不会重用?并发创建会不会重复?这篇都量一遍,并顺手纠正一个我原先以为的说法:序号并不等于父节点的 cversion。
['/q/item-0000000000', '/q/item-0000000001', '/q/item-0000000002']
现在 /q 的 cversion = 3 , 子节点: ['item-0000000000', 'item-0000000001', 'item-0000000002'] 删掉 2 个之后 cversion = 5 , 子节点: ['item-0000000002'] 再创建一个顺序节点 → /q/item-0000000003 | 创建后 cversion = 6 对照实验:/s 下 顺序 → 普通子节点 → 顺序 → 删掉普通子节点 → 顺序: ['n-0000000000', 'n-0000000002', 'n-0000000003'] | 此时 /s 的 cversion = 5
我原本以为序号等于父节点当时的 cversion(第 7 篇),实测不是:cversion 为 5 时拿到的是 3。对照实验显示普通子节点也占用序号,所以这里只下一个能被现象支持的结论:按父节点计数,每创建一个子节点加一,删除不减。准确的内部机制本文没有查源码确认。
/r 下: /r/x-0000000000 | /q 下: /q/x-0000000004 | / 下: /x-0000000003
总数 400 | 不同序号数 400 | 最小 0 最大 399 | 恰好是 0..399: True
创建顺序:z → w → z;得到: ['l-0000000000', 'l-0000000001', 'l-0000000002'] /lk 的子节点排序: ['l-0000000000', 'l-0000000001', 'l-0000000002'] w 的会话关闭后: ['l-0000000000', 'l-0000000002'] (序号不连续,w 的那个没了)