CuratorCache 把 ZooKeeper 的一棵子树镜像到本地内存,并在变化时回调。它让读变成本地查表,但也带来「缓存可能过期」的问题。这篇量加载速度、读的收益、事件的延迟与合并,以及断网期间缓存返回什么。
建缓存并加载完成:98 ms;缓存里的节点数 1001(含 /tree 自己) 读一个节点:缓存 0.14 µs,直接读 ZooKeeper 119 µs(约 826 倍)
缓存要镜像整棵子树,节点更多时要关心 watch 的内存。
建 → NODE_CREATED,延迟 13.3 ms 改 → NODE_CHANGED,延迟 6.7 ms 删 → NODE_DELETED,延迟 3.5 ms 快速 setData 200 次(同步连续):监听器收到 NODE_CHANGED 150 次;缓存里最终值 = v199
合并行为的原因见watch 的一次性。如果每次变更都要处理,请把变更写成顺序节点(队列)而不是改同一个节点。
切断(代理拒绝连接)发生在 +0.0 s;ZooKeeper 里 /cfg 在 +0.3 s 被改成 v2;+6.0 s 恢复网络
+ 0.1s STATE SUSPENDED
+ 3.1s STATE LOST
+ 6.1s STATE RECONNECTED
+ 6.1s VAL v2
缓存在整个断开期间一直返回旧值 v1;恢复后 0.1 s 看到 v2(服务端早在 0.3 s 就已经是 v2)缓存本身没有「过期时间」。需要时请在 ConnectionStateListener 里把应用标记为「配置可能过期」。这里「断网」用 TCP 代理拒绝连接实现。