Skip to content
返回架构决策

决策文档

写 ADR 使未来工程师(或 6 月后的你)能理解决了什么及为何。

为什么

说"我们选 Postgres"的 ADR 无用——6 月后有人问"为何不 DynamoDB?"理由没了。说"我们选 Postgres 因需 join+事务、DynamoDB 被拒因访问模式关系、考虑了 MySQL 但团队会 Postgres"的 ADR 永远有用。决策文档是捕决策时的上下文、备选和理由,使决策可审计、可理、上下文变时可被新 ADR 取代。无它每决策从头重审因无人知为何做。

何时使用

每中+决策、决策时。30-60 分钟写。永不回溯——记忆腐烂。

如何做

1. 用 ADR 模板(Nygard 格式):
   # ADR-NNN:标题
   ## 状态:提议 | 已接受 | 被 ADR-MMM 取代
   ## 上下文:问题、力、约束
   ## 决策:决定了什么
   ## 后果:正+负+中
   ## 考虑备选:还有什么+为何拒
2. 先写上下文——它腐烂最快;捕问题+约束
3. 备选具体:"DynamoDB:拒因访问模式需 join"非"DynamoDB:不适"
4. 记你接受的后果(所做权衡)非仅益
5. 若用 decision-criteria 链标准+分
6. 顺序编号;取代非编辑——决策变时写 ADR-MMM 取代 NNN
7. ADR 存仓库 /docs/adr/ 非 wiki——与代码版本

示例

# ADR-015:订单服务用 Postgres

## 状态:已接受(2024-03-12)

## 上下文
订单服务需存订单+行项带 ACID 事务
(超卖是法律问题)。访问模式:按 id 取、按用户+日期列、
按月聚合。团队会 Postgres、不会 DynamoDB。

## 决策
用 Postgres(RDS 托管、db.r6g.large)。

## 后果
+ join+事务免费
+ 团队能运维(现有专长)
− 垂直扩展限(缓解:列表查询读副本)
− 单区域(接受:订单本就区域)

## 备选
- DynamoDB:拒——访问模式关系(join)非 KV
- MySQL:拒——团队专长 Postgres、此处无 MySQL 优势
- MongoDB:拒——事务更弱、访问模式关系

常见问题

  • ⚠编辑已接受 ADR——历史丢;用新 ADR 取代引旧的,使演进可追。

最佳实践

  • ✓写上下文节如读者不在——6 月后无人记驱决策的力。
  • ✓ADR 保持短(1-2 页)——更长则决策太大;分解为多 ADR。

相关资源