架构决策记录(ADR)
架构决策记录(ADR)
什么是架构决策记录
架构决策记录(Architecture Decision Record,ADR)是一种文档格式,用于捕获软件项目中重要的架构决策。每个ADR聚焦于一个特定决策,记录其上下文、考虑的选项、最终选择以及后果。ADR的核心价值在于让团队成员理解"为什么这样设计",而不仅仅是"设计是什么"。
ADR采用简洁的Markdown格式,通常存放在代码仓库的docs/adr/目录中,与代码一起版本管理。这种做法使得架构决策的演进历史清晰可追溯,新成员可以通过阅读ADR快速了解项目架构的演变过程。
ADR模板结构
一个标准的ADR通常包含以下部分:
# ADR-001: 选择消息队列技术
## 状态
已接受
## 上下文
系统需要处理高吞吐量的异步消息,日消息量约1亿条。
现有团队对RabbitMQ有经验,但Kafka在日志聚合场景下性能更优。
## 决策
我们决定使用Apache Kafka作为消息队列。
## 理由
- Kafka在高吞吐场景下性能显著优于RabbitMQ
- Kafka天然支持消息持久化和回放
- 团队虽无Kafka经验,但学习曲线可控
## 后果
- 需要投入2周进行团队培训
- 初期运维复杂度增加
- 获得了更好的水平扩展能力
决策过程
架构决策通常遵循以下流程:首先识别需要决策的问题,收集相关上下文信息;然后列出所有可行选项,评估各选项的优缺点;最后团队讨论并达成共识,将决策记录为ADR。
ADR不追求完美的决策,而是追求透明的决策过程。即使后来证明某个决策不是最优的,ADR也能帮助团队理解当时的约束条件和权衡考量。
class ADR:
def __init__(self, number: int, title: str):
self.number = number
self.title = title
self.status = "提议"
self.context = ""
self.decision = ""
self.consequences = []
def accept(self):
self.status = "已接受"
def supersede(self, new_adr: 'ADR'):
self.status = f"被 ADR-{new_adr.number} 替代"
最佳实践
编写ADR时应遵循以下原则:保持简洁,每个ADR聚焦于一个决策;及时记录,在决策做出后立即编写;使用编号便于引用;在代码仓库中集中管理;团队共同维护,而非仅由架构师负责。
ADR应该在代码审查中被引用,当修改涉及架构决策时,应引用相关的ADR。这种做法确保了架构决策与实际代码实现的一致性。