场景复现:一场突如其来的“雪崩”
凌晨2点,你被报警电话惊醒:系统访问量激增,核心服务响应时间飙升至30秒,错误率超过80%,用户投诉炸锅——雪崩已发生!此时,你需要像急诊医生一样快速诊断、止血、修复。以下是黄金30分钟的急救指南。
阶段一:黄金5分钟——快速诊断与止损
目标:立即阻止雪崩蔓延,避免“全盘崩溃”。
1. 定位故障源头
- 查看监控大盘(如Prometheus + Grafana):
- 找到第一个异常指标(如支付服务RT突增、数据库连接池耗尽)。
- 确认依赖拓扑图:哪个下游服务最先崩溃?
- 日志排查:
# 快速检索错误日志(示例命令) grep "ERROR" /logs/payment-service.log | tail -n 100
- 高频关键词:
TimeoutException
,Connection refused
,Thread pool exhausted
。
- 高频关键词:
2. 强制熔断故障服务
- 手动熔断:通过Sentinel或Hystrix控制台,对故障服务直接熔断。
# 示例:调用Sentinel API熔断支付服务 curl -X POST http://sentinel-dashboard:8080/circuit/break?service=payment-service
- 降级策略生效:返回缓存数据、默认值或友好提示(如“系统繁忙,请稍后再试”)。
3. 释放资源压力
- 重启消费者线程池:
- 若线程池满,临时扩容或重启服务(慎用!需评估影响)。
- 清理数据库连接:
-- 终止长时间空闲连接(示例MySQL命令) KILL [processlist_id];
阶段二:10分钟——恢复核心链路
目标:优先保障核心业务(如支付、下单),非关键功能降级(如推荐、积分)。
1. 核心服务优先重启
- 顺序策略:
- 数据库/缓存 → 2. 支付服务 → 3. 订单服务。
- 灰度发布:先重启1-2个实例,验证正常后全量恢复。
2. 限流保护
- 全局限流:将入口流量限制到系统能力的50%,避免二次冲击。
# 示例:Sentinel限流规则 - resource: /api/pay limitApp: default grade: 1 # QPS模式 count: 100 # 每秒最多100请求
3. 关闭非关键功能
- 降级所有旁路服务:
- 关闭促销活动页、积分兑换、消息推送等。
- 前端提示:“当前系统繁忙,部分功能暂不可用”。
阶段三:15分钟——验证与逐步恢复
目标:确保系统稳定后,逐步放开流量,复盘根因。
1. 监控验证
- 核心指标观察:
- CPU/内存:是否回归正常水位?
- 响应时间(RT):95%请求是否<1s?
- 错误率:是否<0.5%?
2. 逐步恢复流量
- 按比例放量:
- 限流从50% → 80% → 100%,每5分钟调整一次。
- 恢复降级功能:
- 先恢复只读服务(如商品查询),再恢复写入服务(如扣库存)。
3. 根因分析与止血报告
-
直接原因:
- 例:第三方支付接口超时(99%的请求阻塞30秒)。
-
深层原因:
- 例:未设置熔断规则 + 线程池配置过小(20→200)。
-
输出报告:
故障复盘
- 时间线:02:00-02:45
- 影响:支付失败率85%,持续45分钟
- 根因:第三方支付接口超时触发服务雪崩
- 改进措施:
- 配置支付服务熔断规则(超时1s,错误率50%熔断)
- 线程池扩容至200 + 队列容量1000
终极防御:4个必须备份的“急救包”
- 熔断降级脚本:预置常见故障的熔断规则,一键执行。
- 资源监控看板:实时展示CPU、线程池、数据库连接池水位。
- 服务依赖地图:明确核心链路和降级优先级。
- 应急预案文档:从报警到恢复的完整SOP(标准操作流程)。
总结
处理微服务雪崩就像“救火”:先切断火源(熔断),再扑灭明火(恢复核心服务),最后排查隐患(根因分析)。记住:
- 黄金5分钟比后续5小时更重要
- 预案的尽头是“熟练度”——定期演练故障场景!
延伸行动:
- 下周安排一次“雪崩演练”:随机杀死一个服务,测试团队响应速度。
- 将熔断规则和限流配置写入代码库的“急救”目录。
“系统的高可用不是设计出来的,是演练出来的。”