bigywater.tech
ZooKeeper · 52

服务故障感知

用 ZooKeeper 做服务注册,实例挂了多久能被发现?这篇让真实的实例进程用不同方式「消失」(正常退出、kill -9、被冻结),另一个客户端监听,量发现的时间,再把会话超时从 3 秒改到 10 秒看差别。

11 ms
实例正常关闭会话时被发现的时间
3472 / 9910 ms
kill -9 在会话超时 3 s / 10 s 下被发现的时间
≈ 会话超时
崩溃与冻结被发现的时间由会话超时决定

三种消失方式

实测 · 本机执行输出
  消失方式                           会话超时      watcher 发现用时 ms
  正常退出(close 会话)                  6 s                   11
  kill -9(没来得及 close)             3 s                 3472
  kill -9(没来得及 close)            10 s                 9910
  进程冻结(SIGSTOP,如长 GC)             3 s                 3321
  进程冻结(SIGSTOP,如长 GC)            10 s                10385

会话超时就是摘除延迟

实测 · 本机执行输出
  3 s → 3472 ms;10 s → 9910 ms;差 6438 ms(≈ 7000 ms 的超时差)

这是服务发现里「实例挂了多久会被摘除」的答案,也是第 8 篇里临时节点消失时间的应用。如果应用要求更快的摘除,还可以叠加应用层的健康检查,本文没有测。

分步演示

故障感知
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。单机,tickTime=1000;实例是单独的 Python 进程(kazoo),被观察者用 children watch;每种组合只测一次
    • 没有验证:集群里服务端切换对发现时间的影响、大量实例同时消失时的通知风暴(第 17 篇)、应用层健康检查的叠加、实例重新注册的竞态
    京ICP备2026067502号-1京公网安备11010502063487号