⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

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"

流程缺陷分析

流程环节检查点本次是否缺失
开发代码审查是否发现问题?未发现性能问题
测试是否有性能测试?没有压力测试
部署是否有灰度发布?直接全量发布
监控是否有相关告警?数据库监控不完善

因果图

使用鱼骨图分析多个因素:

                    ┌─ 代码问题 ─ 没有索引

                    ├─ 配置问题 ─ 连接池太小
问题:登录失败 ←────┤
                    ├─ 流程问题 ─ 没有性能测试

                    └─ 监控问题 ─ 没有数据库告警

避坑指南

新手最容易犯的错

  1. 停留在表面原因,不深挖根因
  2. 只分析技术原因,忽略流程缺陷
  3. 5-Why 问得太少(通常需要5次以上)
  4. 把"人的失误"当作根因(应该问为什么会失误)