架构决策记录ADR
架构决策记录ADR
架构决策记录 (ADR)
架构决策记录 (ADR) 是一种用于记录软件架构决策的实践方法。它旨在捕获重要的设计选择及其背后的理由,以便在项目演进过程中提供清晰的上下文和指导。
为什么使用 ADR?
- 知识共享: 帮助团队成员理解架构决策的背景和原因。
- 一致性: 确保架构决策得到一致的执行。
- 可追溯性: 方便追踪决策的演变过程,了解不同方案的权衡。
- 学习: 从过去的决策中吸取经验教训。
识别决策
在进行架构设计时,我们需要识别出需要做出决策的关键点。以下是一些指导原则:
- 关注重要性和紧急程度: 优先考虑对系统架构有重大影响,且需要尽快做出的决策。
- 评估信息完整性: 确定是否需要立即决策,或者可以等待获取更多信息后再做决定。
- 借鉴经验: 参考个人或团队的经验,以及业界公认的设计方法和实现。
- 维护决策清单: 创建并维护一个待办决策事项清单,确保所有关键决策都得到处理。
使用规范
以下是使用 ADR 的规范流程:
1. 识别决策并撰写 ADR 文档
- 发起人职责: 识别需要进行架构决策的问题,并主动承担起草 ADR 文档的责任。
- 文档内容: 按照预定义的 ADR 模板,清晰、完整地记录决策的背景、问题、备选方案、最终选择、以及相关的影响和后果。
2. 发起评审会讨论
- 组织评审: 将 ADR 文档提交给相关团队成员或架构评审委员会进行评审。
- 收集反馈: 在评审会议上,充分听取各方意见,收集反馈和建议。
- 迭代改进: 根据评审结果,对 ADR 文档进行必要的修改和完善。
3. 做出决策并维护到项目
- 明确决策结果: 在充分讨论和权衡后,明确最终的架构决策。
- 记录决策: 将最终决策结果更新到 ADR 文档中。
- 实施决策: 将决策应用到实际的项目开发中。
- 持续维护: 随着项目的演进,定期审查和更新 ADR,确保其与实际情况保持一致。
3.1 创建目录
在项目根目录下创建以下目录(所有文档维护再docs目录):
1
2
3
/docs/adr
-> 0001-xxx-decision.md
-> 0002-yyy-decision.md
3.2 创建文件
请将模版保存为 adr-template.md
格式
{编码}-{决策内容}.md
编码规则
前两位为分类,后两位根据决策时间先后从0自增。
- 0xxx:业务相关
- 1xxx:
- 2xxx:编码相关(编程语言、编码风格、代码格式化、日志、注释规范等)
- 3xxx:中间件相关(SOA、微服务、dubbo、分布式锁)
- 5xxx:前端相关
- 6xxx:安全相关
- 7xxx:测试相关
- 8xxx:部署与基础设施相关
- 80xx:计算相关(云平台)
- 81xx:存储相关(数据库、缓存、队列、zk等)
- 82xx:通讯相关(网络等)
- 9xxx:文档相关(格式、模版等)
模版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# 概览 Summary
* 参与决策人:
* 时间:yyyy-MM-dd
## 问题 Issue
> 描述要解决什么问题以及为什么是现在这个时间点来解决这个问题
例如:
> 我们需要选择一种新的身份验证方法。我们当前的系统使用基于密码的身份验证,这容易受到攻击。我们需要一种更安全的方法来保护用户帐户。
## 决策 Decision
> 最终选择了哪个备选方案,其后果/代价是什么
例如:
> 我们决定使用多因素身份验证 (MFA)。MFA 通过要求用户提供多种身份验证因素来增加安全性。此决策的后果是用户需要设置 MFA,并且登录过程会稍微复杂一些。
## 状态 Status
> 草稿/待评审/已通过,可以根据你所在组织的架构决策流程来定义
例如:
> 已通过
# 上下文 Context
## 假设 Assumptions
> 描述在做出决策时带着什么假设,由于各种原因在决策当时,尚无法验证
例如:
> 我们假设所有用户都拥有智能手机或平板电脑,可用于接收 MFA 代码。
## 约束 Constraints
> 描述在解决该问题时有什么限制条件,例如预算/时间线/资源
例如:
> 我们需要在三个月内实施 MFA。我们有一个专门用于此项目的工程师。
## 备选方案 Positions
> 一组备选方案,如果有人总是问“你们有没有考虑过这种方案”,那么这里是回应的好地方。每个备选方案除了方案本身的描述外,还应该说明如果选择了该方案会有什么后果/代价
例如:
> * **基于密码的身份验证:** 这是我们当前的系统。它易受攻击。
> * **多因素身份验证 (MFA):** 这是一种更安全的身份验证方法。它需要用户提供多种身份验证因素。
> * **生物识别身份验证:** 这是一种非常安全的身份验证方法。它使用生物识别数据(例如指纹或面部扫描)来验证用户。但是,它也可能很昂贵且难以实施。
## 论点 Argument
>
例如:
> 我们选择 MFA 是因为它是一种安全且相对容易实施的身份验证方法。
## 影响 Implications
> 列举采用该决策后带来的影响,比如需要大家学习。
例如:
> * 用户需要设置 MFA。
> * 登录过程会稍微复杂一些。
> * 我们需要培训用户如何使用 MFA。
# 相关的 Related
## 相关的决策 Related decisions
> 列举相关的架构决策,它们也有助于帮助读者理解决策推导过程
例如:
> * 选择身份验证方法
> * 选择授权方法
## 相关的要求 Related requirements
> 列举对相关工具、人员的要求
例如:
> * 需要 MFA 身份验证服务器。
> * 需要一位工程师来实施 MFA。
## 相关的工件 Related artifacts
例如:
> * MFA 实施计划
> * MFA 用户指南
## 相关的架构原则 Related principles
> 列举相关的架构原则,它们也有助于帮助读者理解决策推导过程
例如:
> * 安全第一
> * 用户体验至上
# 记录 Notes
参考文献
- 来自 Cognitect 的《记录架构决策》(DOCUMENTING ARCHITECTURE DECISIONS)
- 来自 BetterProgramming 的《一款简单而强大的工具来记录你的架构决策》(A Simple but Powerful Tool to Record Your Architectural Decisions)——他们称之为 LADR(Lightweight ADR,轻量级 ADR),但是我们使用的格式类似。
- 《软件架构基础》(Fundamentals of Software Architecture)一书也有一个关于架构决策记录的好章节。
本文由作者按照 CC BY 4.0 进行授权