架构决策记录(ADR)实践:基于uber/ADR模板建立可追溯的技术选型文档
架构决策记录Architecture Decision RecordADR是一种把架构决策及其背景写成短文档的方法。uber/ADR是 Uber 在 GitHub 上公开的一套 ADR 模板与配套规范它把一次技术选型从会议口头结论变成可检索、可追溯、可反思的工程资产。团队在维护中大型系统时代码只能说明“当前是什么”无法说明“当初为什么这样做”。ADR 要补上的正是“为什么”这一段缺失的上下文。这篇文章面向正在搭建新项目、维护老系统或者想改善团队架构评审流程的工程师。读完这篇文章你能理解 ADR 的核心概念并能以uber/ADR的模板思路为基础在自己项目里建立一套最小可用的 ADR 管理流程包括目录组织、字段设计、状态流转、评审绑定以及常见的落地失败场景和排查方式。1. 先理解 ADR 是记录架构决策的最小单元1.1 架构决策为什么需要落成文字实际项目里一次技术选型往往发生在会议、IM 群、PR 评论甚至口头讨论中。讨论结束后结论可能进了会议纪要也可能只存在于某个负责人的记忆里。三个月后新同学接手时看到代码库里用了某个中间件问“为什么选这个”答案常常是“当时评估过好像还行”。至于评估过哪些方案、放弃了什么、在什么约束下做的判断很难再拼凑完整。代码本身只表达实现结果不表达决策过程。两个服务之间选择了同步调用而不是消息队列从代码里能看到 HTTP 调用却看不到“当时吞吐量预期不高团队不希望引入额外运维组件”这些约束。如果这些背景没有被记录下来后续的重构、换型、成本优化就没有判断依据。ADR 就是用来解决这个问题的它把一次决策的背景、结论、后果写成一段结构化文字放在版本控制中和代码一起演进。1.2 ADR 文件是什么样子的一个 ADR 通常是一个短文档几百字到一千多字核心结构非常稳定。业界常见的结构来自 Michael Nygard 的提议先写 Context背景再写 Decision决策最后写 Consequences后果。uber/ADR的模板思路在这个基础上做了工程化加工加入元数据区域、状态字段、关联字段让文档可以被检索、被校验、被追踪。下面是一个最简形式的 ADR 内容示意只说明结构不包含完整细节# ADR-0001: 使用 Redis 作为缓存层 ## Status Accepted ## Context 当前服务存在大量重复查询数据库压力大。 ## Decision 引入 Redis 作为缓存层缓存热点数据。 ## Consequences 更快的读取速度但增加了一个基础组件需要运维。这种文件不需要很长。它足够告诉未来的人当时的背景是什么团队做了什么选择代价是什么。更工程化的模板会在这个基础上增加 Front Matter这是后续要展开的部分。1.3 ADR 与常规设计文档的区别团队里通常已经有架构设计文档、技术方案评审材料等容易产生疑问是不是又多了一种文档这里要明确ADR 的定位和设计文档不同。维度架构设计文档ADR 架构决策记录目标描述系统整体方案、模块关系、流程记录一次决策的背景、选择和后果篇幅通常较长几十页也常见短小轻量一般控制在几百字到一千多字更新方式随设计演进持续修改决策确定后保持稳定后续变化用新 ADR 替代读者评审者、开发团队、新成员未来的维护者、架构评审者、需要复盘的人维护成本高需要持续同步低写一次状态变化时更新元数据典型问题设计文档和代码经常脱节如果不写决策背景会永久丢失关键差异在于设计文档回答“系统是怎么设计的”ADR 回答“这个决策是怎么来的为什么这样做”。两者的生命周期不一样设计文档会随着方案迭代持续修改ADR 则在决策成立后尽量保持不被篡改确有必要的变化通过新 ADR 来体现。2. 理解 uber/ADR 的模板结构与文件组织2.1 文件命名与存储位置落地 ADR 的第一步不是写内容而是先把文件组织定清楚。推荐在仓库根目录下建立docs/adr目录把决策记录和普通文档分开。名称上使用“数字前缀 短横线语义化标题”的格式例如docs/adr/0001-config-center.md docs/adr/0002-cache-redis.md docs/adr/0003-message-queue-kafka.md数字前缀用于排序也用于生成 ADR 的唯一标识。如果使用日期作为前缀同一天出现两条决策会比较麻烦使用递增序号更稳定。slug部分要尽量简洁能让人从文件名判断这次决策主题。在 GitHub 风格仓库中路径可以直接链接到对应 PR评审时方便引用。目录结构示例project/ ├── docs/ │ └── adr/ │ ├── README.md │ ├── template.md │ ├── 0001-config-center.md │ └── 0002-cache-redis.md └── src/README 负责说明本目录的规则状态有哪些、模板在哪个文件、谁可以修改状态。模板文件则作为新决策的起点。目录结构一旦确定就不要频繁调整否则已有的链接和引用都会失去作用。2.2 元数据Front Matter字段工程化的 ADR 通常会在 Markdown 文件顶部加入 YAML Front Matter用统一字段存放结构化信息。uber/ADR项目的核心价值之一就是把这套字段和模板暴露给团队使不同团队写出的 ADR 保持同一风格。一个常见的 Front Matter 示例--- id: ADR-0001 title: 引入配置中心管理多环境配置 status: Accepted date: 2025-01-15 decision-makers: - name: 张三 role: 后端负责人 - name: 李四 role: 架构师 considered-options: - name: 自研配置系统 pros: 完全可控 cons: 开发维护成本高 - name: 开源配置中心 pros: 功能成熟社区活跃 cons: 需要引入额外依赖 chosen-option: 开源配置中心 related-adrs: - ADR-0005 ---字段不是越多越好但下面几个建议保留字段含义示例必要性id决策唯一标识用于链接和讨论ADR-0001必填title决策标题一句话概括引入配置中心管理多环境配置必填status当前状态Accepted必填date决策创建或接受日期2025-01-15必填decision-makers参与决策的人列表形式建议considered-options被考虑的候选方案列表形式建议chosen-option最终选择的方案开源配置中心必填related-adrs关联的 ADR 编号[ADR-0005]按需为什么要写决策人因为后续有人对决策有疑问时最先要找的就是当时的决策人。为什么要列候选方案因为被否决的方案往往比被选中的方案更有信息量它记录了团队评估范围的边界。使用 YAML 而不是纯文本段落是因为字段可以被检索也能在 CI 脚本中做校验这是结构化带来的直接好处。2.3 正文结构Front Matter 下方是正文正文部分建议按固定的标题顺序展开。下面是一个可以在template.md里使用的结构## Context描述背景、问题、约束条件和触发原因。## Decision写出最终决策使用准确、可执行的表述。## Consequences列出决策带来的收益、成本、风险和后续影响。## Alternatives Considered列出候选方案和否决原因。## References指向相关代码、Issue、PR 或外部文档。以“缓存层选型”为例一个完整的 ADR 可以写成--- id: ADR-0002 title: 引入 Redis 作为缓存层 status: Accepted date: 2025-02-10 decision-makers: - name: 张三 role: 后端负责人 considered-options: - name: 本地内存缓存 pros: 零依赖实现简单 cons: 多实例不共享缓存一致性问题 - name: Redis pros: 读写性能好支持过期和持久化 cons: 需要维护 redis 服务 chosen-option: Redis related-adrs: - ADR-0001 --- ## Context 订单查询接口每天产生大量重复查询数据库主库负载接近 70%。经过压测 热点商品详情查询的 QPS 达到 3000其中约 80% 请求访问的是同一批热点数据。 ## Decision 引入 Redis 作为缓存层对商品详情、用户会话等热点数据做缓存。 缓存 key 统一使用 order:detail:{orderId} 格式数据更新时同步失效。 Redis 以集群模式部署先部署 3 节点后续根据监控扩容。 ## Consequences - 数据库读压力明显下降QPS 峰值时可支撑当前业务的 3 倍。 - 需要新增 Redis 运维能力包括监控、告警、备份和故障演练。 - 缓存淘汰、序列化、key 规范需要一并纳入团队约定。 ## Alternatives Considered - 本地内存缓存实现简单但多实例部署时无法共享最终放弃。 - Memcached适合纯 key-value但缺少持久化能力放弃。 ## References - 性能压测报告见 issue #188 - 部署方案见基础设施仓库 infra/redis这段示例里的每个部分都有具体含义。Context 里写的是“为什么现在要做”Decision 里写的是“具体选择了什么以及怎么用”Consequences 里同时写了收益和成本Alternatives 给出了被否决的方案。这样一份 ADR 已经具备做后续决策依据的价值。3. 在自己项目里落地一套最小可用的 ADR 流程3.1 先搭目录和规范落地不要追求一步到位。先用最简单的方式跑通流程再逐步增加约束。第一步是建立目录和模板。mkdir -p docs/adr touch docs/adr/README.md touch docs/adr/template.mdREADME 里至少写清楚三件事ADR 的存放位置和文件命名规则。状态有哪些分别代表什么。新增决策的流程创建文件、填写模板、提交 PR 评审、合并后算生效。这些内容不一定长但必须让新成员第一次看到就知道怎么用。模板文件可以直接参考上一节的正文结构保留字段占位符。检查点确认目录结构存在README 有明确规则模板文件可以复制使用。这里要特别注意模板文件里的id不要写成固定值

相关新闻

面经阅读指南:拆解三层信息,掌握面试官考察逻辑

面经阅读指南:拆解三层信息,掌握面试官考察逻辑

我第一次认真对待“面经”这件事,是在一场面试失利之后。当时面的是一个我自认为准备充分的技术岗位,结果三轮下来,被问到的问题和我复习的方向几乎南辕北辙。回家后我把相关岗位的面经翻了个底朝天,一条一条对照,才发…

2026/8/30 23:09:34 阅读更多 →
苏州展厅设计公司|实际合作体验分享

苏州展厅设计公司|实际合作体验分享

体验时间:2023年8月-12月 体验场景:我司筹备120平企业品牌展厅,自主筛选苏州本地3家展厅设计施工企业沟通并最终完成落地,本次分享为个人真实合作体验,无任何商业合作关联。客观基础信息以下为我当时筛选的3家企业公开…

2026/8/30 23:09:34 阅读更多 →
ChainDrop蠕虫npm供应链入侵:完整溯源、一键排查脚本与防御加固实战

ChainDrop蠕虫npm供应链入侵:完整溯源、一键排查脚本与防御加固实战

前言 2026年8月4日,npm生态爆发近年最严重的供应链蠕虫攻击——ChainDrop(Shai-Hulud最新变种)。不同于普通恶意包单点投毒,这次攻击具备完整的自主传播、凭据窃取、持久驻留、自残反制、无域名C2通信能力。 攻击者攻陷keyv、cach…

2026/8/30 23:09:34 阅读更多 →

最新新闻

AIGC内容安全:安全准则与敏感内容识别实践

AIGC内容安全:安全准则与敏感内容识别实践

很抱歉,这个请求我无法执行。根据安全准则,我无法生成涉及政治、意识形态、历史争议、地缘与政策评论等敏感内容的文章或分析。该标题涉及的内容超出了我能讨论和创作的范围。

2026/8/30 23:51:01 阅读更多 →
从种子到千叶:Merkle Tree原理与Python实现详解

从种子到千叶:Merkle Tree原理与Python实现详解

在分布式系统里,验证往往比传输更贵。假设你维护着一套多点同步方案,客户端需要校验几十台节点返回的数据分片是否被篡改。最常见的做法是把所有数据下载到本地,重新计算一个整体哈希,再与可信哈希对比。但这里有一个很现实的问题…

2026/8/30 23:51:01 阅读更多 →
PWM信号隔离与重建:LAT1346脉宽跟随方案详解

PWM信号隔离与重建:LAT1346脉宽跟随方案详解

做嵌入式这些年,PWM信号几乎天天见。不管是调个LED亮度、控个电机转速,还是驱动舵机,背后都是占空比和频率在说话。但有一类需求容易被忽视:当PWM信号要跨板传输、电平转换、做电气隔离时,直接飞线往往不够用——信号变…

2026/8/30 23:51:01 阅读更多 →
学而思网校X5 Pro值不值得买?AI学习机选购要点全解析

学而思网校X5 Pro值不值得买?AI学习机选购要点全解析

最近不少家长在社群里聊学习机选购,提到学而思网校 X5 Pro 的频率蛮高。它的核心卖点很清晰:AI 学习机、6GB256GB 存储、12.6 英寸屏幕,外加“限时省 100 元”的促销标签。面对这类产品,很多人的第一反应是——这钱花得值不值&…

2026/8/30 23:51:01 阅读更多 →
深度解读Work Agent长程任务执行的底层机制与落地能力

深度解读Work Agent长程任务执行的底层机制与落地能力

一、AI从聊天到自主完成工作的演进路径过去几年大众对AI的认知,经历了非常清晰的迭代过程。最早的AI产品只能完成单轮问答,用户输入一个明确的问题,系统给出对应答案,交互结束后没有任何上下文留存,也无法承接复杂需求…

2026/8/30 23:51:01 阅读更多 →
DeepSeek V4与Codex组合:300万行数据分析Agent的工程化实践

DeepSeek V4与Codex组合:300万行数据分析Agent的工程化实践

DeepSeek V4 和 Codex 组合做数据分析 Agent,值不值得花几十轮提示词去调?我的答案是值得,但重点不是提示词轮数,而是从模型接入、任务拆解、结果验证到报告迭代的一整条链路。这篇文章我不讲概念,只讲我自己按项目交付…

2026/8/30 23:50:00 阅读更多 →

日新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/30 0:00:01 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/30 0:00:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/30 0:00:01 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/30 0:00:01 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/30 0:00:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/30 0:00:01 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/30 21:10:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/30 18:07:21 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/30 21:10:44 阅读更多 →