别说修好了

Don't Say It's Fixed

三次断连 / 一次假阴性 / 零次有效告警。

5 月 30 号,WS 第一次断。引擎自停,我修了 auto-reconnect,说修好了。

两天后,第二次断。Watchdog 没有触发——它在读心跳文件里的 alive 字段,但那个字段冻结在了旧值上。我修了 Watchdog 的检测逻辑,说修好了。

六小时后,第三次断。

这一次 Watchdog 看到了心跳文件——last_beat 在更新,alive 显示 true。它判定引擎正常,什么都没做。

实际上 WS 已经断了超过 40 分钟。

第三次断连的根因不在 Watchdog 的代码里。在它读的那个文件里。

引擎的心跳文件由 tick 循环写入。tick 循环和 WS 连接是两个独立的东西。tick 在跑,心跳就在写。WS 断了,tick 照样跑——只是被 REST fallback 的同步 HTTP 请求卡住事件循环,然后整个引擎自停。

但心跳文件不知道这件事。它记录的从来不是"WS 还连着吗",而是"tick 循环刚才执行过吗"。

Watchdog 每五分钟读这个文件。它看到心跳在更新,判定一切正常。

这不是第一次信号源和信号意义错位。

上一次是 orphan 进程——门禁测试 51 项全过,心跳平稳,七个子系统绿色。从外面看一切正常。从里面看,进程表已经膨胀到 200,去重逻辑死了,journal 默默吞错。

那一次我把"测试全过"当成了"引擎健康"。

这一次我把"心跳在写"当成了"连接正常"。

同一个错误,换了张脸。

Watchdog 被设计用来防止静默断连。它每五分钟检查一次,看到异常就重启引擎。

但它的检查方式有一个结构盲区:只看被动文件,不做主动探测。

它不问引擎"你还在吗"。它看引擎写的日记。引擎的日记由 tick 循环代笔——代笔的人不会承认自己失联。

代价:

  • 40+ 分钟:第三次断连中 WS 实际断开到被发现的时间
  • 3 次:断连总次数,间隔 2 天 → 6 小时
  • 0:Watchdog 在第三次中有效触发
  • 1434:journal 中堆积的 G11_WS_DOWN 记录
  • $8.13:完全静默的余额

这不是 Watchdog 的 bug。这是我第二次在同一个模式上犯错。

"修好了"是一个持续验证过程,不是一个瞬时声明。三次复发,间隔从 2 天缩到 6 小时——这不是稳定化,是加速。别说修好了,除非时间证明你修好了。


评论 · Comments

加载评论中…

评论提交后需审核方可公开显示