跳到主要内容
约 3 分钟1 张卡

架构决策记录(ADR)

ADR 保存重要技术选择的上下文、决定和后果。本文负责选型依据、记录状态和验证条件。它用于资深岗位的架构决策追问。

1. 面试核心​

先记住这几条,再读正文
  • 决策记录。 ADR 记录架构选择的约束、备选方案、决定和后果。卡 · 综合题
  • 约束与假设。 硬约束用于淘汰方案,假设通过实验或数据验证。
  • 决策替代。 已接受的 ADR 保留原结论,新 ADR 通过 Superseded 关系替代它。
  • 复审条件。 复审条件将技术决定与 SLO、成本和迁移结果关联。

2. 架构决策范围​

ADR 适合影响广、改动成本高的选择。例如服务边界、存储方案、公开协议和运行平台。局部实现细节留在代码评审中。

判断标准是后续修改是否依赖当时的取舍。重要约束和放弃方案应留下记录,便于后来者复查。

3. 约束​

约束包括业务目标、交付期限和运行能力。性能、一致性、地域与隐私要求需写清适用范围。

例如“峰值 5000 QPS、P99 低于 200 ms”可用于验收。“高性能”缺少可判断的边界。尚未确认的内容标为假设,并指定验证方法。

选型从目标开始,再比较工具。团队已有技能、迁移窗口和供应商退出成本也应计入。

4. 备选方案比较​

保留可行替代方案,并评估维持现状。各方案使用同一组标准:

  • 方案是否满足硬约束。
  • 实现与迁移需要多少投入。
  • 运行故障会影响哪些用户。
  • 方案如何验证,如何退出。

违反硬约束的方案可以提前淘汰。性能结论需有负载、数据量和环境条件。证据不足的项保留为待验证风险。

5. ADR 的内容​

标题:一个具体架构决定
状态、日期、负责人
上下文与问题
约束与假设
备选方案
决定与适用范围
收益、成本与后续工作
验证方式与复审条件

每份 ADR 聚焦一个重要决定。详细流程和代码放在设计文档中。标题可写“订单事件采用 transactional outbox 发布”。读者能直接判断决策对象。

6. 决策状态​

草案使用 Proposed,接受后转为 Accepted。拒绝的方案标为 Rejected,并保存原因。废弃方案可以标为 Deprecated。

新结论通过新 ADR 表达。新记录接受后,旧记录标为 Superseded,并链接新记录。原上下文和后果仍保留,便于解释迁移期行为。

7. 决策验证​

ADR 关联实现任务、压测结果和运行指标。验证条件需包含目标值、负责人和复审时间。

例如异步复制方案需写出允许的 RPO。复制延迟告警和灾后对账用于验证这一约束。长期超出目标时,按复审条件重新评估。

架构检查还能验证模块依赖与 API 兼容性。可执行规则用于发现实现偏离。

8. ADR 评审​

评审确认问题、证据和决策负责人。具体分歧处理见设计评审。

ADR 中保留最终决定、未消除风险和验证任务。尚有阻塞任务时,记录继续处于 Proposed。接受状态表示决定获准,运行结果仍需持续验证。

9. 示例​

订单服务需要可靠发布事件。团队已有 MySQL 与 Kafka,业务允许秒级延迟。业务记录和待发事件需要共同提交。

可以比较直接双写与 transactional outbox。直接双写存在一侧成功的窗口。Outbox 使用本地事务写入业务和待发事件。发布器负责重试,消费者负责去重。

决策后果包括事件表清理和发布延迟监控。验证需覆盖发布器崩溃与重复投递。机制见Transactional Outbox 与 CDC。

10 · 面试题卡片​

先想答案,再翻面先在心里答一遍,再点开卡片对照参考回答。卡片之间可以左右切换,看完会回到这里。
逐张翻看 1 张 →

10.1 做技术选型时怎样形成可追溯的架构决策​

出现公司:暂无已核验的公开来源(本站自测)

题型:综合题

考察重点

  • 理解问题、硬约束、假设和证据。
  • 理解备选方案、后果与可逆性。
  • 理解ADR 生命周期、验证和复审条件。

相关内容:架构决策范围至ADR 评审。

参考回答

可追溯的选型需要记录约束、方案、证据和后果。

硬约束用于淘汰方案,假设用原型或压测验证。可行方案与维持现状使用同一组评估标准。

ADR 保存最终决定、适用范围和验证条件。决定接受后保留原结论。约束变化时,新 ADR 链接并替代旧记录。实现任务与运行指标用于核验决定是否仍然适用。

11. 参考资料​