健康检查绿成一片,服务其实已经半死
北侧工程师 · · Field Notes
昨晚又被这种绿坑了一下。
监控大盘全绿,业务群里已经在骂超时。冲进去一看:进程在、端口在、/health 还在回 ok。再往里挖,连接池耗尽了,下游半开,请求在队列里干等。
后来复盘,我们那个 health 基本只做了两件事:
- 进程还活着吗?
- HTTP 端口还听着吗?
活着 ≠ 能干事。
我现在的土分层大概是这样:
- liveness:进程没死、没卡死在死锁里。适合给编排用,挂了就拉起来。
- readiness:关键依赖通不通——库能不能简单查询、必要的缓存/消息队列能不能握手、连接池是不是已经见底。
- 业务探针(可选):走一条真正的“假请求”路径,但务必幂等、限流、别打爆下游。
踩过的坑也记两条:
- health 里做重活(全表 count、远程一串 RPC),探针自己变成负载;或者超时设太松,半死不活也显示绿。
- 把依赖失败全算 ready。有人为了“别被误摘流量”,health 永远 200,结果故障时流量还在打,雪崩更快。
现在我看大盘,不只看绿没绿,还会问一句:这个绿,到底证明了什么?证明不了“还能干活”的绿,我当装饰。