后端架构师亲述:12个高可用建站真相
|
接口背锅——去年一月三号凌晨两点十七分,那个订单幂等性超时告警,根本不是网关层的问题。是支付回调里一个重试策略写死了三秒固定间隔,而 DBA 给的 pg_stat_activity 采样窗口刚好错开了这三秒——我敢打包票。但没人看采样窗口,全在查网关日志,连着改了四版限流规则,灰度开关没推完,前端就切了新埋点,结果监控大屏上那条 Redis 连接池使用率曲线突然往下掉了一小格,像被谁用橡皮擦蹭了一下。 PM 老张昨天又把「用户中心页首屏 TTFB 压到三百毫秒内」塞进 sprint goal 里,我说你先看看上个月七次发版里有六次是因为他加的「实时余额浮窗」触发了 session 复制风暴,他说“那正好验证高可用设计”,说完端着印着公司 logo 的蓝色马克杯去倒水——杯底还沾着半颗冻干咖啡渣,没冲干净。测试小李当场把 Postman 里 mock 的 /v2/balance 接口返回延时调成十八毫秒,反复刷了二十七次,说“看不出卡顿”。可就是这十八毫秒,在并发压测里放大出三百七十二次调用失败。这个我说不准是不是线程池打满,但我知道——它一定不是 CDN 的锅。 我原以为加个本地缓存兜底能扛住支付回调风暴,结果发现下游风控系统每五分钟会清一次本地 cache key,而我们的缓存过期时间设的是四分五十九秒。不是 bug,是节奏差。就像两个人在黑暗里对拍手,差半拍,就永远接不上。我们吵了三轮——跟 DBA,他咬死“主从延迟稳定在一毫秒内”,我指着他自己的 Grafana 看板里一条标着“replication_lag_micros”的抖动曲线:“这根线昨儿下午三点零八分跳到一百四十三毫秒,你告诉我它稳?”他看了眼手机,oncall 手机震了一下,没回。后来他真去查了 WAL 发送队列,结果发现是上游有个 Python 脚本定时删日志,磁盘 IO 尖峰和复制恰好撞上了。这种事你编不出来,但你得信它真发生过。 优胜劣汰?对。不是架构图里画的“多活单元自动隔离”,是活人跪着修完半夜三点的故障后,第二天早上十点会议纪要里那一行小字:“暂停推进异地多活 POC,资源协调待评估。” 然后测试小李默默把“压测脚本里模拟网络分区”的 case 全注释掉了——她怕再触发一次熔断链式反应。这个我敢打包票,因为她上周给我微信发了截图,备注写着“别转给 PM”。 有次上线,运维把 docker run 的 --oom-kill-disable=false 忘写了,结果 Java 容器在 GC 尖峰时被宿主机直接杀掉,重启间隙里下游服务连了三十七秒空连接。没人提 OOM Kill,全在改 Feign 的 connect timeout。而真正的解法是把 JVM MaxMetaspaceSize 锁死了,但锁完又引发类加载竞争,导致 /actuator/health 每隔两分十七秒假死一次。这事最后是前端同事发现的——他调健康检查接口做 loading 状态判断,说“接口总在整点后十七秒卡一下”,然后顺手改了自己前端轮询的节拍逻辑。我没拦他,因为拦了也白拦,他已经把 axios 的 retry 增加到五次,并手动在 header 加了 x-request-origin: frontend-sabotage。现在这个 header 还在生产环境跑着。 KPI 我不想谈,但去年我们组人均故障复盘报告写了十五份,平均单份二千一百字,其中三百二十七字描述“与产品确认需求背景”,八百零三字分析“中间件选型合理性”,剩下全是“后续改进措施”——而今年的 OKR 里,“缩短 MTTR” 这项权重降到了 8%。我不怪谁,只记得上季度财务那边问能不能把 ELK 集群磁盘扩容预算挪到年会经费里,DBA 老陈当时正盯着屏幕里一条慢查询的执行计划,头也不抬:“挪吧,反正慢日志采样率我刚降到百分之二。”
文章配图,仅供参考 反常识结论?高可用从来不是靠堆机器。是你知道在数据库连接池 maxActive 设成 32 的时候,某个 Spring Boot starter 会偷偷建第 33 个 idle connection 并让它挂着,直到凌晨四点心跳检测超时才归还——这玩意在低流量时段根本不显形。我们盯了整整八天,才在 gc 日志第三段落里看见一行 "WeakHashMap$Entry@" 开头的引用链。这种细节,画不出架构图,PPT 里放不下,但你在 oncall 期间摸黑查 log 的第十个小时,会把它当真事儿记在烟盒背面。 再说句实话:真正崩过的系统,九成没触发过熔断。它们是在重试逻辑嵌套三层之后,由第六个下游服务返回了一个 HTTP 400,而第一个上游又把这个 400 当 success 解析了。我们追了三天,在 TraceID 末尾发现少了一个字母,最后是运维小王去查 k8s event 时偶然看见 pod 描述里一句 “reason: ‘Evicted’”,才想起上个月批量清理镜像时漏掉了某台节点上的旧 registry 镜像缓存。现在那台节点还挂着黄标,不过没人敢动——它跑着唯一一份未接入 ServiceMesh 的旧订单核心。 我桌上还有半包没拆的薄荷糖,绿色包装,去年双十一发的,糖纸边角有点卷。昨天下午三点二十一分,我剥开一颗扔嘴里,忽然想到一件事:我们所有“高可用”决策,本质都是在赌概率。赌缓存不会集体失效,赌 Kafka 不会丢分区,赌开发改完代码真点了“push”。至于真相?真相就是——没人在乎真相,只要故障没上日报,就算赢。所以接下来我要做的事很简单:把灰度开关彻底关掉,让全部流量打过去,看看这波新配置到底撑不撑得住。撑住了,下周我申请换掉那台挂黄标的物理机;撑不住,我就先把那半包薄荷糖分给测试小李,她值班最多。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


建站资源零散?技术驱动重构整合双轨架构
后端架构师三步调优,服务器吞吐量翻倍
政策驱动下产创融合后端架构破局烟囱式开发
MySQL高可用入门:告别单点故障,轻松实现自动容灾
站长学院:SQL Server存储过程与触发器高可用实战