架构评审会议模板:把讨论收束到决策

0阅读12分钟

会议要服务决策

我做架构评审这些年,见过太多这样的场景:八个人坐在会议室里,讨论了一个半小时,最后谁也没说清楚到底决定了什么。有人说「我觉得应该用 Kafka」,另一个人说「RabbitMQ 在上一家公司用得挺好」,然后两个人围绕消息队列选型吵了四十分钟,其他人在旁边刷手机。

这不是评审,这是聊天。

架构评审会议的核心问题是——它需要产出一个明确的决策,而不是一堆散落的意见。会议模板的作用,就是把这个决策过程结构化,让每个参会者知道该准备什么、该讨论什么、该带走什么。

Michael Nygard 在 2011 年提出 Architecture Decision Record(ADR)时说过一句话:「架构是其决策的积累」。如果评审会议不能把这些决策清晰地记录下来,那这个会议就只是噪音。

这篇文章会给出一套可以直接用的会议模板,覆盖会前材料、会中流程、会后输出三个阶段,并配上案例、检查清单和常见问题对照。

理论根基:从 ATAM 到 ADR

架构评审不是某个团队的发明。它背后有几十年的方法论积累。

ATAM:架构权衡分析法

卡内基梅隆大学软件工程研究所(SEI)的 Rick Kazman 等人在 2000 年提出了 Architecture Tradeoff Analysis Method(ATAM)。这套方法的核心思路是:不直接评价架构好不好,而是先定义质量属性场景(比如「在 1000 并发下响应时间不超过 200ms」),再逐一检查架构是否能满足这些场景,最后识别出敏感点、权衡点和风险点。

ATAM 的意义在于——它把架构评审从「我觉得这个方案不行」变成了「这个方案在 X 场景下有 Y 风险」。讨论的锚点从个人偏好转移到了可验证的约束条件。

ADR:轻量级决策记录

ADR 是 ATAM 在工程实践中的轻量延伸。Michael Nygard 的原始模板包含五个部分:Title、Status、Context、Decision、Consequences。后来社区扩展出了 Considered Options、Rationale 等字段,但核心思想没变——把「为什么选了这个方案」和「放弃了什么」写清楚。

Martin Fowler 在 2026 年 3 月更新的文章中强调,ADR 不只是文档,它本身就是一种思考工具:写 ADR 的过程会迫使决策者把自己的逻辑理顺,尤其是在有多个利益相关方参与的情况下。

TOGAF 架构评审清单

The Open Group 的 TOGAF 框架提供了一份架构评审清单,覆盖系统工程的多个维度:供应商稳定性、源码可获取性、企业配置管理、标准合规性等。这份清单适合大型企业做架构治理时使用,对于中小团队来说偏重,但其中「先检查约束条件,再讨论方案」的思路值得借鉴。

三种方法论交汇在一起,指向同一个结论:架构评审的重点不是选最优方案,而是识别风险和约束,让决策有据可循。

三个真实案例:没有模板的评审是怎么翻车的

案例一:消息队列选型——讨论了 90 分钟,没有结论

场景:电商平台需要引入异步消息队列处理订单,团队在 Kafka、RabbitMQ、RocketMQ 之间犹豫。架构评审会议上,三个人各执一词。

翻车过程

// ❌ 坏做法:没有预读材料,评审会变成头脑风暴

// 会议记录(原始版)
// 张三:我觉得 Kafka 吞吐量大,适合订单场景
// 李四:RabbitMQ 路由灵活,我们团队熟悉
// 王五:RocketMQ 支持事务消息,订单需要这个
// 张三:Kafka 也能做,只是配置复杂一点
// 李四:但我们团队对 RabbitMQ 更熟,出问题能排查
// ...(循环了 40 分钟)
// 会议结束,没有结论,下周再议

问题诊断:没有人在会前明确「我们到底在权衡什么」。三个人其实在讨论不同的维度——吞吐量、团队熟悉度、事务消息能力——但没有一张表把这些维度拉齐。

修复方案:引入结构化的方案对比模板。

<!-- ✅ 好做法:会前提交方案对比表 -->
## 方案对比:订单异步消息队列选型
 
| 维度 | Kafka | RabbitMQ | RocketMQ |
|------|-------|----------|----------|
| 吞吐量 | 百万级/秒 ✅ | 万级/秒 | 十万级/秒 |
| 事务消息 | 不支持原生事务 ❌ | 不支持 ❌ | 原生支持 ✅ |
| 团队熟悉度 | 低 ⚠️ | 高 ✅ | 中 |
| 运维复杂度 | 高(依赖 ZK/KRaft) | 低 ✅ | 中 |
| 消息回溯 | 支持 ✅ | 不支持 ❌ | 支持 ✅ |
| 社区生态 | 最活跃 ✅ | 活跃 | 活跃(国内为主) |
 
**推荐方案**:RocketMQ
**推荐理由**:订单场景需要事务消息保证一致性,这是硬性约束。
Kafka 吞吐量大但不支持事务消息,RabbitMQ 吞吐量和事务都不满足。

有了这张表,会议从 90 分钟缩短到 25 分钟。讨论集中在「事务消息是不是硬性约束」和「团队能否在两周内上手 RocketMQ」两个具体问题上,最终当场决策。

案例二:微服务拆分——每个人都在画自己的架构图

场景:一个单体应用准备拆分成微服务,技术负责人发起架构评审。会上六个参会者带了六张不同的架构图,每张图的边界划分、服务粒度、数据流都不一样。

翻车过程

// ❌ 坏做法:没有统一的架构描述模板,每个人用自己的表达方式

// 架构图 A(张三画的):
// [用户服务] --> [订单服务] --> [库存服务]
//
// 架构图 B(李四画的):
// [前端网关] --> [用户中心] --> [交易中心] --> [仓储中心]
// [交易中心] --> [支付中心]
//
// 架构图 C(王五画的):
// 按领域模型画了 12 个限界上下文,每个限界上下文又分了子域

问题诊断:不是谁画错了,而是三个人在讨论不同层次的问题。张三在说调用链路,李四在说服务边界,王五在说领域模型。没有统一的描述框架,评审变成了鸡同鸭讲。

修复方案:使用 arc42 模板的「上下文视图 + 容器视图」两层结构,要求所有方案用同一套模板描述。

流程图画布 · 115%
Mermaid 流程图加载中...

统一的描述框架解决了「各说各话」的问题。评审会议的讨论从「你的图对不对」变成了「在这个约束下,哪种拆分更合理」。

案例三:数据库选型——评审通过了,上线后踩坑

场景:一个内部工具项目,评审会上选了 MongoDB 作为主数据库。理由是「文档模型灵活,适合快速迭代」。上线三个月后,需要做复杂的关联查询和报表统计,MongoDB 的聚合管道写不动了,团队被迫引入 PostgreSQL 做数据同步,维护成本翻倍。

翻车过程

// ❌ 坏做法:评审只讨论了当前需求,没有考虑演进约束

// ADR-0012(原始版)
// 标题:内部工具使用 MongoDB
// 背景:项目需要快速上线,数据结构不固定
// 决策:选择 MongoDB 作为主数据库
// 后果:开发速度快,文档模型灵活
//
// 缺失的字段:
// - 没有列出「考虑过的选项」(PostgreSQL、MySQL)
// - 没有分析「非功能需求」(报表、关联查询)
// - 没有设定「 reassess 条件」(什么时候需要重新评估)

问题诊断:ADR 只记录了「为什么选」,没有记录「放弃了什么」和「什么情况下需要改」。这种 ADR 在三个月后回头看,根本不知道当初有没有考虑过关系型数据库。

修复方案:扩展 ADR 模板,强制要求填写 Considered Options、Non-functional Requirements 和 Reassess Conditions。

<!-- ✅ 好做法:完整的 ADR 模板 -->
## ADR-0012:内部工具数据库选型
 
**状态**:Superseded by ADR-0031
 
**背景**:内部工具项目,需要 4 周内上线 MVP。数据结构不固定,
字段可能频繁增减。初期用户量 < 500,无复杂报表需求。
 
**非功能需求**
- 查询模式:以单文档 CRUD 为主(初期)
- 关联查询:初期不需要,3 个月后可能需要统计报表
- 运维:团队无专职 DBA,需要托管服务
 
**考虑的选项**
1. MongoDB Atlas(文档模型,托管服务)
2. PostgreSQL on RDS(关系模型,托管服务)
3. MySQL on RDS(关系模型,托管服务)
 
**决策**:选择 MongoDB Atlas 作为 MVP 阶段数据库。
 
**理由**
- MVP 阶段数据结构变化频繁,文档模型减少 migration 成本
- MongoDB Atlas 免费层足够 MVP 使用
- 3 个月后如果出现复杂查询需求,通过 MongoDB Connector for BI
  桥接到分析层,或迁移到 PostgreSQL
 
**后果**
- ✅ 开发速度:MVP 2 周完成数据层
- ⚠️ 风险:如果报表需求提前出现,需要提前迁移
- 🔄 重新评估条件:当出现 3 个以上多表关联查询需求时
 
**后续**:该 ADR 在第 11 周因报表需求触发重新评估,
被 ADR-0031(PostgreSQL + Redis 缓存方案)替代。

这份完整的 ADR 让后来接手的人能清楚知道:当初为什么选 MongoDB、什么时候发现不合适、怎么做的迁移决策。

会议模板:三个阶段的完整清单

把上面的案例经验抽象出来,形成一套可复用的模板。

阶段一:会前材料(决定会议是否需要开)

会前材料的核心目标是让提案人把问题想清楚,而不是让评审人在会上帮他想。

材料项必须/可选说明
问题背景与目标必须要解决什么问题?不解决会怎样?
非目标必须这次不解决什么?避免讨论范围膨胀
约束条件必须时间、预算、团队能力、技术栈限制
推荐方案及理由必须你推荐什么?为什么?
备选方案(至少 2 个)必须考虑过什么?为什么放弃?
架构图或数据流图必须用统一模板,至少包含上下文视图
风险与待决问题必须你识别到的风险,以及需要会议讨论的问题
性能/成本估算可选涉及资源投入时必须提供
ADR 草稿可选如果决策明确,提前写好 ADR 节省时间

硬性规则:如果「推荐方案」和「备选方案」两项为空,会议取消。这不是评审,这是让评审委员会帮你做方案。

阶段二:会中流程(30-45 分钟)

时间段内容负责人规则
0-5 分钟提案人概述背景和推荐方案提案人只复述材料重点,不展开讨论
5-20 分钟澄清性问题全体只问「什么意思」「为什么」,不提「我建议」
20-35 分钟讨论权衡与风险全体围绕方案对比表和风险清单,不跳话题
35-40 分钟确认决策决策人明确结论:通过/有条件通过/退回修改
40-45 分钟分配行动项决策人每条行动项指定 Owner + 截止时间

角色分工

// 评审会议的四个角色
//
// 1. 提案人(Author)
//    - 负责准备材料和捍卫方案
//    - 有权在讨论中修改方案
//
// 2. 决策人(Decider)
//    - 只有一人,拥有最终拍板权
//    - 通常是 Tech Lead 或架构师
//    - 不是投票制,是「一人决策」
//
// 3. 评审人(Reviewer)
//    - 提供专业意见,没有否决权
//    - 从各自领域(安全、性能、运维)提问
//
// 4. 主持人(Facilitator)
//    - 控制时间和讨论范围
//    - 打断偏离主题的讨论
//    - 记录决策和行动项

阶段三:会后输出(24 小时内)

输出项内容格式
决策结果通过/有条件通过/退回 + 关键理由会议纪要文档
ADR完整的决策记录Markdown,存入 docs/adr/
行动项列表每条有 Owner + Deadline项目管理工具
待补充材料需要在下次评审前补充的内容清单,指定 Owner

关键原则:会议纪要不是逐字稿。只记录影响决策的信息——关键问题、不同意见、确认结论和行动项。

方案对比表:四种常见评审模式

不同规模和类型的架构决策适合不同的评审模式。

维度轻量 ADR 评审正式架构评审会ATAM 评估异步评审
适用场景单个技术选型系统级架构变更大型系统质量属性评估小决策、跨时区团队
参与人数2-4 人5-8 人5-15 人不限
时间投入1-2 小时(含写 ADR)30-45 分钟会议1-3 天异步 2-3 天
材料要求ADR 草稿完整方案文档 + 架构图质量属性场景 + 架构模型ADR 或 RFC 草稿
产出批准的 ADR决策 + 行动项风险评估报告 + 建议评论汇总 + 决策
优点轻量、可追溯面对面沟通充分系统化、覆盖全无需协调时间
缺点不适合复杂权衡容易超时、需要强主持成本高、需要培训反馈质量参差
典型使用数据库选型、框架选择微服务拆分、技术栈迁移金融系统、安全合规场景配置变更、小功能设计

ADR 模板对比:三种主流格式

ADR 的格式选择取决于团队规模和工具链。

维度Nygard 原始模板MADR(Markdown ADR)Y-Statements
字段数5 个9 个1 句话
核心字段Title, Status, Context, Decision, Consequences+ Considered Options, Rationale, Pros/Cons「We decided to X, in the context of Y, for the sake of Z」
文档长度半页到一页一到两页一句话
适合团队中小团队,刚引入 ADR中大型团队,需要完整追溯敏捷团队,极简文档
工具支持adr-toolsadr-tools + VS Code 插件无特定工具
优点简单、学习成本低信息完整、支持自动化极度轻量
缺点缺少选项对比字段多,写起来慢无法承载复杂决策
推荐场景大多数团队的首选需要审计追溯的场景小决策的快速记录

好/坏做法对比:从材料到决策

<!-- ❌ 坏做法 A:背景描述模糊 -->
## 背景
现在的系统性能不太好,需要优化。
我们考虑引入缓存来改善。
 
<!-- ✅ 好做法 A:背景描述有数据支撑 -->
## 背景
商品详情页 P99 响应时间从 120ms 退化到 850ms(过去 30 天),
主要原因是每次请求都查询 MySQL。
QPS 约 2000,其中 85% 是重复商品的重复查询。
目标:将 P99 降到 200ms 以内。
<!-- ❌ 坏做法 B:没有非目标 -->
## 方案
引入 Redis 集群作为全系统统一缓存层。
 
<!-- ✅ 好做法 B:明确非目标,防止范围膨胀 -->
## 方案
引入 Redis 缓存商品详情页查询结果。
 
## 非目标
- 不缓存搜索结果(由 Elasticsearch 负责)
- 不缓存用户会话数据(后续单独评审)
- 不做缓存预热(MVP 阶段流量可接受冷启动)
<!-- ❌ 坏做法 C:风险描述空泛 -->
## 风险
- 缓存可能不一致
- 运维复杂度增加
 
<!-- ✅ 好做法 C:风险有场景、有应对方案 -->
## 风险
1. 缓存一致性:商品价格变更后缓存可能延迟更新
   - 应对:商品变更时主动删除缓存 key(Cache-Aside 模式)
   - 残余风险:极端情况下 3 秒内可能读到旧价格(TTL=3s)
2. 缓存穿透:恶意请求不存在的商品 ID
   - 应对:对空结果缓存 30 秒 + 布隆过滤器
3. Redis 单点故障:当前计划使用单节点
   - 应对:启用 Redis Sentinel 自动故障转移
   - 接受风险:MVP 阶段允许 5 分钟缓存不可用
<!-- ❌ 坏做法 D:行动项模糊 -->
## 行动项
- 张三:调研 Redis 集群方案
- 李四:看看有没有现成的缓存框架
 
<!-- ✅ 好做法 D:行动项有 Owner、截止时间和交付物 -->
## 行动项
| # | 行动项 | Owner | 截止时间 | 交付物 |
|---|--------|-------|---------|--------|
| 1 | 完成 Redis Sentinel 部署方案 | 张三 | 06/30 | 架构文档 + 成本估算 |
| 2 | 评估 Spring Cache vs Lettuce 客户端 | 李四 | 06/28 | 对比文档(含 benchmark) |
| 3 | 制定缓存 key 命名规范 | 王五 | 06/27 | 规范文档,提交 PR |

评审常见问题速查表

常见问题症状解法
评审变聊天讨论了 30 分钟还在发散主持人打断,拉回议程
没有结论会议结束没人知道决定了什么最后 5 分钟强制确认决策
材料缺失提案人只带了一页 PPT取消会议,要求补充材料
范围膨胀从数据库选型聊到公司战略明确非目标,超出范围的记为「后续议题」
过度设计评审要求在 MVP 阶段考虑百万并发回到约束条件,用数据说话
ADR 写不出决策理由写不清楚说明决策本身可能没想清楚,退回重新思考
评审太晚代码已经写完才来评审前置评审节点到方案设计阶段
反复评审同一个议题评审了三次还没结论检查是否有信息缺失,指定 Owner 限期补充

架构评审检查清单

会前准备阶段

  • 问题背景和目标描述清晰,有数据支撑
  • 非目标已明确列出,防止讨论范围膨胀
  • 约束条件(时间、预算、团队能力、技术栈)已列出
  • 推荐方案有明确的理由,不是「因为流行」
  • 至少列出 2 个备选方案,说明放弃原因
  • 架构图使用团队统一的模板和符号
  • 风险已识别并附有应对方案
  • 需要会议讨论的问题已明确列出

会议进行阶段

  • 提案人在 5 分钟内完成概述,不展开细节
  • 澄清性问题阶段不混入方案建议
  • 讨论围绕方案对比表和风险清单展开
  • 偏离主题的讨论被主持人及时打断
  • 决策人在最后 5 分钟给出明确结论
  • 每条行动项指定了 Owner 和截止时间

会后跟进阶段

  • 会议纪要在 24 小时内发布
  • ADR 已写入 docs/adr/ 目录并编号
  • 行动项已录入项目管理工具
  • 需要补充的材料已指定 Owner 和截止日期
  • 上次评审的遗留行动项已跟踪

落地建议

如果你的团队从来没有做过结构化的架构评审,不要一步到位引入 ATAM。从以下三步开始:

  1. 先写 ADR。不管多小的决策,用 Nygard 的五字段模板写下来。重点不是模板,而是养成「把理由写清楚」的习惯。

  2. 用方案对比表代替口头讨论。任何涉及技术选型的评审,要求提案人在会前提交一张对比表。这张表本身就是思考过程的外化。

  3. 从 30 分钟会议开始。按照本文的会中流程模板,严格控制时间。前几次可能会有些生硬,但坚持三轮之后,团队会形成节奏。

当团队习惯了这套流程,再根据需要引入更重的评估方法。大多数团队需要的不是更复杂的评审框架,而是把基础动作做到位。

参考资料

评论 0

0 / 1000