服务雪崩是资源耗尽引发的级联失效,需通过紧急限流、手动熔断、降级响应立即止损;结合线程堆栈、日志时间戳、连接数等指标定位首爆点;再分层验证网关、缓存、数据库健康度;恢复后须分级设超时、业务线程池隔离、加固缓存策略并加入主动健康探测。
高并发下服务雪崩不是单点故障,而是资源耗尽引发的级联失效。处理核心不是“修某个接口”,而是快速切断故障传播链、释放阻塞资源、定位根本瓶颈。
雪崩发生时,首要目标是阻止恶化,而非深挖根因:
不靠猜,靠指标交叉验证:
jstack [PID] > dump.txt 抓取当前线程快照,重点搜索 WAITING 或 BLOCKED 状态,看是否大量线程卡在数据库连接获取(getConnection)、Redis 响应等待或下游 HTTP 调用上;error.log 中首次出现 upstream timed out 的时间,和应用日志中第一条 TimeoutException 或 Connection refused 的时间是否吻合——吻合点即为雪崩起点;ss -tnp | grep :8080 | wc -l 查当前 ESTABLISHED 连接数,对比 max_connections 和 worker_connections × worker_processes,若接近上限,说明连接池或 Nginx 连接资源已耗尽。排除“假雪崩”——很多看似后端崩溃,实为反代或中间件配置失当:
curl -w "%{http_code} %{time_total}n" http://[后端IP]:8080/health 批量测试各实例,确认是否真不可用,还是 Nginx 重试机制放大了问题;INFO stats 查 rejected_connections 和 expired_keys 是否突增;运行 KEYS *(仅开发环境)或 SCAN 辅助判断是否存在大量 Key 同时过期(缓存雪崩典型特征);SHOW PROCESSLIST,看是否有大量 Waiting for table metadata lock 或长时间 Sleep 连接;查慢查询日志,确认是否因某条 SQL 拖垮整个连接池。雪崩平息后,只重启服务远远不够,需加固薄弱环节:
readTimeout=2000,Druid 连接池设 connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000;CallerRunsPolicy 避免丢请求);/health,连续失败 N 次自动触发熔断,而不是等第一次请求失败才反应。