连载中 19/20

事故集锦:六个微服务故障复盘

2026-08-31 · 698 阅读 · 0 评论 · 0 赞

事故一:注册中心的空列表雪崩

现象:机房交换机抖动两分钟,全站接口超时,恢复网络后还持续了五分钟。定位:调用方日志一片 "no instances available",注册中心后台健康实例数归零。根因:保护阈值没开,网络抖动导致心跳批量超时,健康实例被全部误杀,调用方拿到空列表。修复:开保护阈值(0.8)+ 调用方本地缓存兜底 + 网络恢复演练。教训:宁可旧列表,不要空列表

事故二:配置全量推送改崩线程池

现象:晚上十点改了个"无伤大雅"的参数,半小时后订单积压。定位:变更记录显示线程池核心数被从 20 改成 2(少打一个 0),全量推送秒级生效。根因:配置变更无灰度、无审批、无范围校验。修复:生产配置双人复核 + Beta 灰度先行 + 关键参数上下限校验。教训:配置生效有多快,错误生效就有多快

事故三:网关连接池打满

现象:大促开门红,全站 502 三分钟。定位:网关到下游的连接数顶死在默认值 500,队列溢出。根因:网关压测时用的是单接口小流量,真实流量下下游 RT 变长、连接占用时间翻倍,连接池按低估的容量配的。修复:按"峰值 QPS × 下游 P99 RT × 冗余系数"重算池容量,全链路压测常态化。教训:容量是算出来的,不是默认出来的

事故四:重试风暴放大三倍

现象:下游服务 GC 停顿 10 秒,上游集体超时重试,下游恢复后立刻被三倍流量打死,再也没起来。定位:下游 QPS 曲线在故障期是平时的 3.2 倍。根因:多级调用方各自配了 3 次重试且立即重试,故障期流量层层放大。修复:重试次数降到 1、指数退避加抖动、重试进熔断器统计、下游入口限流兜底。教训:每一层的好心,叠起来就是雪崩

事故五:观测系统拖垮业务

现象:接入全量链路追踪一周后,高峰期业务线程偶发卡顿。定位:追踪后端存储打满、上报堆积,Agent 同步上报占住业务线程。根因:全量采样 × 每请求几十个 Span,超出后端容量;Agent 未配异步与丢弃策略。修复:按流量定采样率、错误强制保留、Agent 异步上报且队列满即丢弃。教训:观测是系统的一部分,也会成为故障源

事故六:灰度标签在 MQ 断链

现象:灰度验证一切正常,全量后出现零星数据错乱。定位:灰度订单发出的消息没带版本标签,消费方按旧版逻辑处理了新版数据。根因:标签透传清单里漏了 MQ 这一段——HTTP 链路全打通了,消息链路没人管。修复:标签透传做成框架级拦截,HTTP、MQ、定时任务全覆盖,缺标报警。教训:灰度链路只要断一跳,就是薛定谔的版本

复盘的共同点

六个事故,三类根源:变更失控(二、六)、默认值陷阱(一、三、五)、放大器效应(一、四)——而每一类,前面章节都给过对应的闸门。下一篇收官,把整个系列的地图拼成一张全景图

503

10 年全栈工程师 · 503咖啡馆主理人

#微服务事故#故障复盘#注册中心雪崩#重试风暴#灰度断链

评论 (0)

相关推荐

连载中 12/20

排查四件套:jstack、jmap、jstat、jcmd 的实战分工

jstack 看线程在干什么,jmap 看堆里装了什么,jstat 看运行时在变什么,jcmd 是统一入口。四把刀各管一段,配合着用没有查不动的现场。

#jstack#jmap#jstat#jcmd#排查工具
2026-09-16 · 4 阅读 · 0 评论 · 0 赞
连载中 11/20

GC 日志:把回收过程翻译成人话

一行 GC 日志里塞着七种信息:谁触发的、收了哪、停了多久、活了哪些。加上 -Xlog 配置,再加上日志分析工具,GC 不再是只能盯监控曲线的黑盒。

#GC日志#Xlog#日志分析#GC监控#Full GC排查
2026-09-16 · 13 阅读 · 0 评论 · 0 赞
连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 8 阅读 · 0 评论 · 0 赞