← 返回首页
📋

架构决策记录(ADR)

📂 architecture ⏱ 1 min 73 words

架构决策记录(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。这种做法确保了架构决策与实际代码实现的一致性。