欢迎光临
我们一直在努力

【架构实战】架构评审方法论:让每个决策经得起考验

一、一次没有评审的架构决策让我后悔3年

2019年,我决定用MongoDB做订单存储。

理由很简单:

  • 订单结构复杂,MySQL要设计很多表
  • MongoDB文档模型灵活,直接存JSON
  • 网上说MongoDB性能好

没有评审,我自己拍板了。

3年后,问题来了:

  • 事务支持弱:订单涉及多个操作,MongoDB事务性能差
  • 运维成本高:集群运维复杂,出问题不知道怎么排查
  • 人才招聘难:会MongoDB的人少,招聘成本高
  • 生态不完善:工具链不如MySQL成熟
  • 迁移成本高:最终花了大代价迁移回MySQL
  • 如果当时做了架构评审,这个问题5分钟内就会被发现:

    • 运维同事:“我们团队没人会MongoDB”
    • DBA:“MongoDB的事务性能不行,订单场景不合适”
    • 架构师:“你考虑过数据一致性吗?”

    二、架构评审流程

    2.1 完整流程图

    ┌─────────────────────────────────────────────────────────────────┐
    │ 架构评审完整流程 │
    │ │
    │ 阶段1:准备阶段(评审前3天) │
    │ ├── 编写架构设计文档(ADR) │
    │ ├── 准备技术选型对比表 │
    │ ├── 性能评估报告 │
    │ ├── 风险分析文档 │
    │ └── 发送评审材料给评审团 │
    │ │
    │ 阶段2:评审会议(1-2小时) │
    │ ├── 架构师讲解方案(20分钟) │
    │ ├── 评审团提问质疑(30分钟) │
    │ ├── 讨论替代方案(20分钟) │
    │ └── 总结和投票(10分钟) │
    │ │
    │ 阶段3:结论阶段 │
    │ ├── 通过 → 进入开发阶段 │
    │ ├── 有条件通过 → 修改后复审 │
    │ └── 不通过 → 重新设计方案 │
    │ │
    │ 阶段4:跟进阶段 │
    │ ├── 记录评审结论 │
    │ ├── 跟进Action Item │
    │ └── 项目结束后复盘 │
    │ │
    └──────────────────────────────────────────────────────────────────┘

    2.2 架构设计文档模板

    # 架构设计文档 – 订单系统重构

    ## 1. 背景与目标

    ### 1.1 背景
    – 当前订单系统单表已超过5000万条记录
    – 查询性能下降,P99延迟超过3秒
    – 需要支持未来3年10倍增长

    ### 1.2 目标
    – 查询P99延迟 < 200ms
    – 支持日均1000万订单
    – 系统可用性 99.99%

    ### 1.3 非目标
    – 不涉及支付系统改造
    – 不涉及物流系统改造

    ## 2. 整体架构

    ### 2.1 架构图
    [插入架构图]

    ### 2.2 核心设计
    – 分库分表:按user_id分库,按order_id分表
    – 读写分离:主库写,从库读
    – 缓存策略:Redis缓存热点数据

    ## 3. 技术选型

    | 组件 | 方案 | 备选方案 | 选择理由 |
    |——|——|———-|———-|
    | 分库分表中间件 | ShardingSphere | MyCat | 社区活跃,功能完善 |
    | 数据库 | MySQL 8.0 | PostgreSQL | 团队经验丰富 |
    | 缓存 | Redis Cluster | 本地缓存 | 支持分布式 |

    ## 4. 详细设计

    ### 4.1 数据模型
    [插入ER图]

    ### 4.2 接口设计
    [插入API文档链接]

    ### 4.3 部署架构
    [插入部署图]

    ## 5. 性能评估

    ### 5.1 容量规划
    – 预计QPS:5000
    – 单库QPS:3000
    – 需要2个分库

    ### 5.2 压测结果
    [插入压测报告链接]

    ## 6. 风险分析

    | 风险 | 影响 | 概率 | 应对方案 |
    |——|——|——|———-|
    | 分片键选择错误 | 高 | 中 | 提前做数据分布分析 |
    | 从库延迟 | 中 | 高 | 关键业务读主库 |
    | 扩容困难 | 高 | 低 | 预留2倍容量 |

    ## 7. 实施计划

    | 阶段 | 内容 | 时间 | 负责人 |
    |——|——|——|——–|
    | 阶段1 | 表结构设计 | 1周 | 张三 |
    | 阶段2 | 分库分表开发 | 2周 | 李四 |
    | 阶段3 | 数据迁移 | 1周 | 王五 |
    | 阶段4 | 灰度上线 | 1周 | 赵六 |

    ## 8. 附录

    – [需求文档链接]
    – [参考架构链接]
    – [相关技术文档链接]


    三、评审清单详解

    3.1 业务层面

    业务层面评审清单:

    □ 业务场景理解
    □ 核心业务流程是什么?
    □ 用户是谁?使用场景是什么?
    □ 业务痛点在哪里?

    □ 业务增长预估
    □ 预计用户增长?
    □ 预计数据增长?
    □ 预计流量增长?

    □ 业务对齐
    □ 是否和产品经理确认过需求?
    □ 是否和运营确认过场景?
    □ 是否和业务方确认过验收标准?

    □ 业务风险
    □ 方案是否影响现有业务?
    □ 迁移方案是否可行?
    □ 回滚方案是否完善?

    3.2 技术层面

    技术层面评审清单:

    □ 技术选型
    □ 选型理由是否充分?
    □ 是否有备选方案对比?
    □ 是否有POC验证?
    □ 社区活跃度如何?
    □ 是否有生产案例?

    □ 性能
    □ 是否有性能瓶颈?
    □ 是否做了压测?
    □ 是否有缓存策略?
    □ 数据库索引是否合理?

    □ 可靠性
    □ 是否有单点故障?
    □ 是否有容灾方案?
    □ 是否有降级熔断?
    □ 数据一致性如何保证?

    □ 安全
    □ 是否有安全风险?
    □ 是否有鉴权机制?
    □ 敏感数据是否加密?
    □ 是否有防攻击措施?

    □ 扩展性
    □ 是否支持水平扩展?
    □ 是否预留了容量?
    □ 是否考虑了未来需求?

    3.3 运维层面

    运维层面评审清单:

    □ 部署
    □ 部署方案是否可行?
    □ 是否需要新增资源?
    □ 是否有部署文档?

    □ 监控
    □ 是否有监控指标?
    □ 是否有告警规则?
    □ 是否有日志收集?

    □ 应急
    □ 是否有应急预案?
    □ 是否有回滚方案?
    □ 是否有值班机制?

    □ 成本
    □ 运维成本是否可控?
    □ 是否需要新增人力?
    □ 许可证费用如何?

    3.4 团队层面

    团队层面评审清单:

    □ 能力匹配
    □ 团队是否有相关经验?
    □ 是否需要培训?
    □ 学习曲线如何?

    □ 人力资源
    □ 是否有足够人力?
    □ 是否有backup?
    □ 是否依赖外部资源?

    □ 知识传承
    □ 是否有文档?
    □ 是否有培训计划?
    □ 是否有代码Review机制?


    四、踩坑实录

    坑1:评审走过场

    问题:评审会变成走过场,大家都不认真提意见。

    踩坑场景:
    每次评审会,大家都说"没问题",结果上线后问题一堆。因为大家觉得"反正是架构师定的,出了问题也是他的责任"。

    解决方案:

    # 评审机制改进:

    1. 评审前提前3天发材料
    – 让评审团有时间阅读
    – 要求每人至少提3个问题

    2. 设置"魔鬼代言人"
    – 每次评审指定一人专门找茬
    – 轮流担任,避免针对个人

    3. 匿名投票
    – 避免从众心理
    – 确保真实意见

    4. 评审结果考核
    – 评审团对决策质量负责
    – 出了问题复盘时追究

    坑2:只评审不跟进

    问题:评审提了很多意见,但没有跟进落实。

    踩坑场景:
    评审会上提了10条意见,会后没人跟进,项目上线后发现问题还在。

    解决方案:

    # 跟进机制:

    1. 记录Action Item
    – 每条意见对应一个Action Item
    – 明确负责人和截止日期

    2. 定期跟进
    – 每周周会汇报进展
    – 项目经理负责跟进

    3. 复审机制
    – 重要修改需要复审
    – 确保意见落实到位

    4. 项目复盘
    – 项目结束后回顾评审意见
    – 总结经验教训

    坑3:评审太晚

    问题:方案已经开发完了才评审,改不动了。

    踩坑场景:
    开发团队闷头做了2个月,写完代码才提交评审。评审发现设计有问题,但代码都写完了,改不动。

    解决方案:

    # 评审时机:

    1. 概念验证阶段
    – 技术选型评审
    – 确定技术方向

    2. 设计阶段
    – 架构设计评审
    – 确定整体方案

    3. 详细设计阶段
    – 详细设计评审
    – 确定实现细节

    4. 开发阶段
    – 代码Review
    – 确保实现质量

    ⚠️ 开发前必须完成设计评审!

    坑4:评审人不对

    问题:参加评审的人都不了解业务,提不出有价值的意见。

    踩坑场景:
    评审团都是技术背景,没人懂业务。结果技术方案没问题,但业务逻辑有漏洞。

    解决方案:

    # 评审团组成:

    必须参加:
    – 架构师(技术决策)
    – 技术负责人(实现可行性)
    – 产品经理(业务对齐)
    – 运维代表(运维可行性)
    – 安全代表(安全评估)

    可选参加:
    – 测试代表(测试可行性)
    – DBA(数据库评估)
    – 业务专家(业务场景)

    坑5:没有记录

    问题:评审讨论了很多,但没有记录,后来忘了。

    踩坑场景:
    评审会上讨论热烈,但没有会议纪要。过了几个月,大家忘了当时的决策理由,出了问题不知道为什么这样设计。

    解决方案:

    # 评审记录模板:

    ## 评审会议纪要

    **时间**:2024-01-15 14:00-16:00
    **地点**:会议室A
    **参与人**:张三、李四、王五、赵六
    **记录人**:张三

    ### 评审议题
    订单系统分库分表方案

    ### 讨论要点
    1. 分片键选择
    – 方案A:order_id
    – 方案B:user_id
    – 最终选择:user_id分库,order_id分表
    – 理由:大部分查询带user_id,可避免跨库查询

    2. 数据迁移方案
    – 讨论了双写方案和停机迁移方案
    – 最终选择:双写迁移,风险更低

    ### 决策结论
    – 状态:有条件通过
    – 条件:
    1. 补充数据迁移详细方案
    2. 完善回滚预案

    ### Action Item
    | 编号 | 内容 | 负责人 | 截止日期 |
    |——|——|——–|———-|
    | 1 | 编写数据迁移方案 | 李四 | 2024-01-20 |
    | 2 | 编写回滚预案 | 王五 | 2024-01-20 |
    | 3 | 复审 | 张三 | 2024-01-22 |


    五、最佳实践

    5.1 评审原则

    架构评审五大原则:

    1. 尽早评审
    – 设计阶段就评审
    – 不要等开发完了再评

    2. 充分准备
    – 提前发材料
    – 评审团认真阅读

    3. 多方参与
    – 技术、业务、运维、安全
    – 多角度发现问题

    4. 记录决策
    – 会议纪要
    – ADR文档

    5. 跟进落实
    – Action Item跟进
    – 项目复盘

    5.2 评审检查表

    评审前检查:
    □ 评审材料已发送
    □ 评审团已确认参加
    □ 会议室已预订
    □ 投影设备已测试

    评审中检查:
    □ 架构师讲解清晰
    □ 所有问题已记录
    □ 决策理由已说明
    □ 结论已达成共识

    评审后检查:
    □ 会议纪要已发送
    □ Action Item已分配
    □ 后续安排已确认


    六、血的教训

    没有评审的架构决策就是赌博。你赌赢10次,输1次就够你喝一壶。

    我那次MongoDB的决策,输得很惨:

    • 迁移花了3个月
    • 团队加班加点
    • 业务受影响
    • 个人信誉受损

    如果当时做了评审,这些问题在5分钟内就会被发现。


    七、思考题

  • 你的团队有架构评审机制吗?效果如何?
  • 你遇到过哪些评审不到位导致的问题?
  • 你觉得什么样的评审才是有效的?

  • 个人观点,仅供参考

    赞(0)
    未经允许不得转载:171主机测评 » 【架构实战】架构评审方法论:让每个决策经得起考验
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址