【iSAQB软件架构】架构决策记录-ADR

ADR(Architecture Decision Record,架构决策记录) 是一种轻量级、可追溯的决策管理工具 ,用于记录软件架构演进中的关键技术选择及其背后的逻辑。它解决了传统设计文档的痛点------"为什么当初选择这个方案?" 的集体失忆问题。以下是其核心解析:


ADR 的核心价值

问题场景 ADR的解决方式
新成员质疑技术选型 提供历史决策背景与权衡分析
重复讨论已解决的架构问题 明确记录备选方案拒绝原因
技术债务归因模糊 关联决策与后续后果
架构演进缺乏连续性 形成决策链(通过Supersedes链接)

ADR 标准结构(精简必选部分)

markdown 复制代码
# [简短决策标题]  
## 状态  
  提议 (Proposed) | 已通过 (Accepted) | 已弃用 (Deprecated) | 已取代 (Superseded)  
## 背景  
  [待解决的问题/需求,用数据支撑]  
  > 例:订单查询接口 p99 延迟达 2s,超出 SLA 要求的 500ms  
## 选项分析  
  | 选项 | 优点 | 缺点 |  
  |------|------|------|  
  | A    | ...  | ...  |  
  | B    | ...  | ...  |  
## 决策  
  [选择的方案 + **理由**]  
  > 例:采用 Redis 缓存而非数据库分片,因业务存在 80% 的查询重复率  
## 后果  
  [需付出的代价/后续影响]  
  > 例:需运维团队维护 Redis 集群,增加 2 节点成本 $200/月  

ADR 实践指南

1. 决策粒度控制
  • ✅ 记录跨模块影响的决策(如消息队列选型、认证方案)
  • ❌ 不记录纯实现细节(如类命名规范)
2. 版本化存储
  • 目录结构示例:

    bash 复制代码
    docs/adr/
    ├─ 0001-use-redis-for-query-caching.md  # 按顺序编号
    ├─ 0002-adopt-grpc-instead-of-rest.md
    └─ README.md  # 索引所有ADR
3. 生命周期管理

评审通过 方案过时 被新方案替代 提议 已通过 已弃用 已取代 新ADR链接

4. 工具链集成
  • 生成工具adr-tools(命令行自动创建模板)

    bash 复制代码
    adr new "Use Redis for caching"
  • 文档展示:VS Code + Markdown Preview Enhanced 插件


ADR vs. 传统设计文档

维度 ADR 传统设计文档
目标 记录为什么选择 描述是什么
更新频率 每次架构变更追加新记录 大版本重构时整体重写
可读性 单文件聚焦单一决策 冗长综合文档
可追溯性 通过状态链追踪演进 依赖文档版本对比

经典案例

markdown 复制代码
# 002:使用 Kafka 替代 RabbitMQ 处理订单事件  
## 状态:已通过 (2025-03-20)  
## 背景  
  - 黑五流量峰值 10万订单/秒,RabbitMQ 集群出现堆积  
  - 监控显示 RabbitMQ 单集群吞吐上限 5万/秒  
## 选项分析  
| 选项       | 优点                  | 缺点                |  
|------------|-----------------------|---------------------|  
| RabbitMQ   | 团队熟悉,运维简单    | 横向扩展需重构集群  |  
| Kafka      | 吞吐量 >100万/秒      | 需学习新运维知识    |  
## 决策  
  选择 Kafka:  
  - 满足未来 3 年流量增长需求  
  - 运维成本可通过培训降低(计划投入 5人日)  
## 后果  
  - 需改造订单服务事件发布代码  
  - 新增 Kafka 监控到 Grafana 看板  

💡 关键洞察 :ADR 不是增加文档负担,而是将日常决策转化为组织资产 。当团队在 2 年后质疑"为什么用 Kafka 不用 Pulsar?"时,只需打开 docs/adr/002.md 即可还原历史上下文。

相关推荐
Coder个人博客11 小时前
Linux6.19-ARM64 mm mmu子模块深入分析
大数据·linux·车载系统·系统架构·系统安全·鸿蒙系统
子兮曰12 小时前
OpenClaw入门:从零开始搭建你的私有化AI助手
前端·架构·github
剩下了什么13 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥14 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉14 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变14 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
不凉帅14 小时前
NO.7系统架构设计和软件质量
系统架构
晚霞的不甘15 小时前
CANN 在工业质检中的亚像素级视觉检测系统设计
人工智能·计算机视觉·架构·开源·视觉检测
island131415 小时前
CANN HIXL 高性能单边通信库深度解析:PGAS 模型在异构显存上的地址映射与异步传输机制
人工智能·神经网络·架构
山岚的运维笔记16 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver