11.4.2 根因分析:技术原因与流程缺陷
一句话破题
找到问题的根本原因而不是表面原因。"数据库挂了"是现象,"连接池配置不当"才是根因。
核心价值
深入的根因分析能让你:
- 避免头痛医头脚痛医脚
- 发现系统性的问题
- 制定真正有效的改进措施
5-Why 分析法
从现象出发,连续追问"为什么",直到找到根本原因:
markdown
## 5-Why 分析
**现象:用户无法登录**
1. 为什么用户无法登录?
→ 登录 API 返回 500 错误
2. 为什么 API 返回 500?
→ 数据库查询超时
3. 为什么数据库查询超时?
→ 数据库连接池耗尽
4. 为什么连接池耗尽?
→ 有慢查询占用连接不释放
5. 为什么有慢查询?
→ 缺少索引,且没有查询超时配置
**根因:缺少数据库索引 + 没有配置查询超时**根因分类
技术根因分析
代码层面
typescript
// 问题代码:没有设置查询超时
const user = await prisma.user.findFirst({
where: { email }
})
// 改进后:设置超时时间
const user = await prisma.user.findFirst({
where: { email },
// Prisma 暂不支持查询级超时,需要在连接层配置
})配置层面
yaml
# 问题配置:连接池太小
DATABASE_URL="postgresql://user:pass@host:5432/db?connection_limit=5"
# 改进配置:合理的连接池大小
DATABASE_URL="postgresql://user:pass@host:5432/db?connection_limit=20&connect_timeout=10"流程缺陷分析
| 流程环节 | 检查点 | 本次是否缺失 |
|---|---|---|
| 开发 | 代码审查是否发现问题? | 未发现性能问题 |
| 测试 | 是否有性能测试? | 没有压力测试 |
| 部署 | 是否有灰度发布? | 直接全量发布 |
| 监控 | 是否有相关告警? | 数据库监控不完善 |
因果图
使用鱼骨图分析多个因素:
┌─ 代码问题 ─ 没有索引
│
├─ 配置问题 ─ 连接池太小
问题:登录失败 ←────┤
├─ 流程问题 ─ 没有性能测试
│
└─ 监控问题 ─ 没有数据库告警避坑指南
新手最容易犯的错
- 停留在表面原因,不深挖根因
- 只分析技术原因,忽略流程缺陷
- 5-Why 问得太少(通常需要5次以上)
- 把"人的失误"当作根因(应该问为什么会失误)
