Arch Day 14: 架构风格混合实战
真实的大型系统永远不是只用一种架构风格——它是多种风格在不同模块、不同层级、不同阶段的混合体。架构混合实战的核心能力是知道在哪里画线——哪些模块用事件驱动、哪些用同步API、哪些用CQRS——并能用架构决策矩阵(Architecture Decision Matrix)记录和论证每个选择。
日期: 2026-04-13 (Day 14) 阶段: 第一阶段 - 架构基础 标签: #混合架构 #架构决策矩阵 #Cell-Based-Architecture #ADR #Week2总结
核心概念
一句话定义
真实的大型系统永远不是只用一种架构风格——它是多种风格在不同模块、不同层级、不同阶段的混合体。架构混合实战的核心能力是知道在哪里画线——哪些模块用事件驱动、哪些用同步API、哪些用CQRS——并能用架构决策矩阵(Architecture Decision Matrix)记录和论证每个选择。
为什么资深架构师仍需关注
做了10年软件,你会发现教科书上的"纯"架构风格在真实世界几乎不存在:
- "我们是微服务架构"——但核心记账模块是个巨大的单体,因为需要强一致性
- "我们是事件驱动架构"——但用户登录和权限校验还是同步RPC,因为不能等
- "我们是分层架构"——但数据分析模块用了CQRS+流处理,因为读写模式完全不同
资深架构师的价值不在于选择"一种风格",而在于:
- 识别混合的边界:在哪里从同步切到异步?从单体切到微服务?
- 管理混合的复杂度:风格越多,集成点越多,一致性越难保证
- 论证每个选择:用ADR记录为什么这个模块选了这种风格,而不是那种
- 演进混合架构:业务变化时,知道哪些边界需要移动
常见误区与反模式
| 误区 | 真相 | 后果 |
|---|---|---|
| "整个系统必须统一一种风格" | 不同模块有不同的架构特征需求 | 某些模块被迫使用不适合的风格 |
| "混合越多越灵活" | 每增加一种风格都增加集成复杂度 | 系统变成"百家风格大杂烩" |
| "技术栈也要统一" | 核心模块可以统一,但边缘模块可以选最合适的 | 用Java写机器学习/用Python写高频交易 |
| "先选风格再设计" | 应该先分析需求再选风格 | 为了用某种"先进"风格而扭曲设计 |
| "大厂的架构可以照搬" | 大厂的架构是为大厂的规模和约束设计的 | 10人团队运维100个微服务+Kafka+K8s |
知识点详解
知识点1: 混合架构的边界原则
原则1: 按架构量子(Architecture Quantum)划分
Day 8学过的架构量子概念在这里是关键工具。每个量子可以选择最适合自己的风格:
系统级别:
├── 量子A (用户服务): 模块化单体 (CRUD为主,简单直接)
├── 量子B (订单/支付): 微服务 + Saga (跨服务事务)
├── 量子C (数据分析): CQRS + 事件流 (读多写少)
├── 量子D (通知服务): 事件驱动 (异步发送)
└── 量子E (规则引擎): 微内核/插件 (规则频繁变化)
关键: 量子之间的通信方式也需要设计
├── 量子间同步: REST/gRPC (查询/命令)
├── 量子间异步: 消息队列/事件流 (通知/数据同步)
└── 量子间共享: 只共享数据契约(schema),不共享代码
原则2: 按变更频率和变更原因划分
高频变更(业务规则/UI):
└── 适合: 微服务/微前端 → 独立部署
中频变更(业务流程):
└── 适合: 事件驱动 → 通过事件编排新流程
低频变更(核心领域/基础设施):
└── 适合: 模块化单体 → 稳定性优先
不同变更原因应该在不同模块:
├── 监管变更驱动 → 合规模块
├── 用户体验驱动 → 前端/BFF
├── 性能需求驱动 → 核心计算引擎
└── 业务创新驱动 → 新产品模块
原则3: 按一致性需求划分
强一致性 (不允许临时不一致):
└── 用同步调用 + 数据库事务
└── 例: 记账、余额扣减
最终一致性 (可以短暂不一致):
└── 用异步事件 + 对账
└── 例: 搜索索引更新、数据分析
因果一致性 (按因果顺序一致):
└── 用事件溯源 + 有序消息
└── 例: 用户操作日志、审计追踪
知识点2: 架构决策矩阵方法
什么是架构决策矩阵:
架构决策矩阵是一种系统化的选型工具,将每个模块的架构特征需求与候选架构风格进行量化对比。
步骤:
Step 1: 列出系统中的核心模块/量子
Step 2: 对每个模块,识别Top 3架构特征
Step 3: 对每种候选架构风格,评估其对这些特征的支持程度(1-5分)
Step 4: 加权计算总分,选择最高分的风格
Step 5: 审查:是否有"必须"级别的硬性约束被违反?
实例:电商系统决策矩阵
| 模块 | 关键特征 | 单体 | 微服务 | 事件驱动 | CQRS | 选择 |
|---|---|---|---|---|---|---|
| 用户管理 | 简单性(5), 安全性(4), 可维护性(3) | 4+4+4=46 | 3+5+4=43 | 2+4+3=33 | 2+4+3=33 | 单体 |
| 商品目录 | 可伸缩性(5), 性能(4), 可部署性(3) | 2+4+2=28 | 4+3+5=43 | 3+3+4=36 | 5+5+3=47 | CQRS |
| 订单处理 | 一致性(5), 可追踪性(4), 弹性(3) | 5+3+2=35 | 4+4+4=44 | 3+5+4=43 | 3+4+4=40 | 微服务 |
| 支付 | 安全性(5), 一致性(5), 性能(3) | 5+5+4=47 | 4+3+3=33 | 2+3+3=27 | 3+4+3=34 | 单体(模块) |
| 搜索 | 性能(5), 可伸缩性(4), 弹性(3) | 2+2+2=20 | 3+4+4=39 | 3+3+3=30 | 5+5+4=51 | CQRS |
| 通知 | 弹性(5), 可伸缩性(4), 简单性(3) | 2+2+3=24 | 3+4+3=35 | 5+5+3=47 | 2+3+2=24 | 事件驱动 |
| 数据分析 | 性能(5), 可伸缩性(5), 模块化(3) | 1+1+2=14 | 3+4+4=39 | 4+4+3=39 | 5+5+4=51 | CQRS+事件流 |
注:分数 = 特征支持度(1-5) × 权重(该特征的重要性分数)
矩阵审查检查项:
□ 每个模块的Top 3特征是否真正反映了业务需求?
□ 评分是否有证据支持(基准测试/案例/经验)而非主观臆断?
□ 是否考虑了"硬性约束"?(如监管要求数据不出境→排除特定云服务)
□ 选择的风格组合是否增加了过多的集成复杂度?
□ 团队是否有能力驾驭这些风格?(没人会Kafka就不要选事件驱动)
知识点3: Cell-Based Architecture (单元化架构)
背景: 这是蚂蚁金服和微众银行在实践中总结出的架构模式,专门解决超大规模微服务系统的可用性和灾备问题。
核心思想:
传统微服务:
所有服务部署在同一套环境中,任何一个服务故障都可能影响所有用户
Cell-Based Architecture:
将系统分成多个独立的Cell(单元),每个Cell是一个完整的迷你系统:
├── 包含所有必要的微服务
├── 有自己的数据库
├── 能独立服务一部分用户
├── 一个Cell故障不影响其他Cell
类似于潜水艇的水密舱:
一个舱进水了,关闭舱门,其他舱不受影响
架构示意:
[全局路由层]
(按用户ID路由)
/ | \
/ | \
[Cell A] [Cell B] [Cell C]
用户0-33% 用户34-66% 用户67-100%
┌──────┐ ┌──────┐ ┌──────┐
│User │ │User │ │User │
│Order │ │Order │ │Order │
│Pay │ │Pay │ │Pay │
│DB-A │ │DB-B │ │DB-C │
└──────┘ └──────┘ └──────┘
Cell A故障 → 影响33%用户 → 路由层切换到备用Cell A'
其他Cell完全不受影响
Cell-Based的关键设计决策:
| 决策点 | 选项 | 蚂蚁的做法 |
|---|---|---|
| 路由键 | 用户ID / 地域 / 租户 | 用户ID(确保同一用户的所有请求在同一Cell) |
| Cell大小 | 固定 / 动态 | 固定(简化运维) |
| Cell数量 | 少而大 / 多而小 | 中等(通常3-5个,兼顾隔离和成本) |
| 跨Cell通信 | 允许 / 禁止 | 尽量禁止(跨Cell=跨用户,通常不需要) |
| 数据同步 | 实时 / 异步 | 异步(跨Cell的数据最终一致) |
| 全局服务 | 每Cell部署 / 中心化 | 少数全局服务中心化(如配置中心) |
Cell-Based vs 传统微服务:
| 维度 | 传统微服务 | Cell-Based |
|---|---|---|
| 故障影响范围 | 全部用户 | 一个Cell的用户 |
| 扩容方式 | 扩单个服务 | 扩整个Cell |
| 运维复杂度 | 中 | 高(多套环境) |
| 适合规模 | 万-百万用户 | 亿级用户 |
| 成本 | 低-中 | 高(每个Cell是完整环境) |
| 数据隔离 | 按服务隔离 | 按用户分片隔离 |
何时考虑Cell-Based:
✅ 用户规模 > 1000万
✅ 单个服务故障不可接受(金融、支付)
✅ 有多地域部署需求(如跨国)
✅ 有严格的数据隔离要求(如多租户SaaS)
❌ 用户规模 < 100万 (过度设计)
❌ 服务间强依赖(跨Cell通信频繁)
❌ 团队运维能力不足
知识点4: 混合架构中的集成模式
当不同风格的模块需要通信时,集成方式的选择至关重要:
场景1: 同步模块 ↔ 同步模块
└── REST/gRPC直接调用
└── 注意: 需要处理超时/重试/熔断
场景2: 同步模块 → 异步模块
└── 同步模块发消息到队列 → 异步模块消费
└── 同步模块不等待结果(fire-and-forget)
└── 如果需要结果: 用回调/webhook/轮询
场景3: 异步模块 → 同步模块
└── 异步模块通过适配器同步调用
└── 注意: 异步模块的吞吐量可能远超同步模块的处理能力→需要限流
场景4: 事件驱动模块 ↔ CQRS模块
└── 事件驱动产生的事件直接作为CQRS的写入
└── CQRS的读模型可以被事件驱动模块查询
场景5: 单体模块 → 微服务模块
└── 通过API Gateway或BFF层路由
└── 单体内部暴露特定API供微服务调用
└── 关键: 不要让微服务直接访问单体的数据库!
集成反模式:
反模式1: 数据库集成(Database Integration)
两个模块共享同一个数据库表
→ 任何Schema变更都影响两个模块
→ 正确做法: 每个模块有自己的数据,通过API/事件同步
反模式2: 同步链(Synchronous Chain)
A → B → C → D → E (每个都是同步调用)
→ 一个挂全挂,总延迟 = 所有延迟之和
→ 正确做法: 识别可以异步化的环节
反模式3: 双向依赖(Bidirectional Dependency)
A调B,B也调A
→ 循环依赖,部署和测试的噩梦
→ 正确做法: 引入事件或第三方(C)打破循环
反模式4: 万能适配器(God Adapter)
一个适配器层连接所有不同风格的模块
→ 适配器变成了新的单点和瓶颈
→ 正确做法: 每对集成有自己的适配逻辑
知识点5: 架构演进——从单体到混合的迁移路径
绞杀者模式(Strangler Fig Pattern):
Phase 1: 在单体旁边部署新的微服务
┌──────────────────────┐
│ Monolith │ [新Service A]
│ ┌─────┬─────┬─────┐ │
│ │ A │ B │ C │ │
│ └─────┴─────┴─────┘ │
└──────────────────────┘
请求仍然100%走单体
Phase 2: 通过路由将部分请求导向新服务
┌──────────────────────┐
│ Monolith │ [新Service A]
│ ┌─────┬─────┬─────┐ │ ↑
│ │ (A) │ B │ C │ │ A的请求(30%)
│ └─────┴─────┴─────┘ │
└──────────────────────┘
A的请求: 30%新服务, 70%单体(渐进迁移)
Phase 3: A完全迁出,B开始迁移
┌──────────────────────┐
│ Monolith │ [Service A] [新Service B]
│ ┌─────┬─────┐ │
│ │ (B) │ C │ │
│ └─────┴─────┘ │
└──────────────────────┘
Phase 4: 单体只剩C(可能永远留在单体中)
┌──────────────┐
│ Monolith │ [Service A] [Service B]
│ ┌─────┐ │
│ │ C │ │ C留在单体中可能是正确的选择
│ └─────┘ │ (如果C的架构特征需求适合单体)
└──────────────┘
迁移顺序的选择标准:
| 优先迁移 | 延后迁移 |
|---|---|
| 独立性高的模块 | 和其他模块紧耦合的 |
| 变更频率高的模块 | 稳定不怎么改的 |
| 需要独立伸缩的模块 | 资源需求均匀的 |
| 团队边界清晰的模块 | 跨团队共享的 |
| 有明确API边界的模块 | 通过数据库共享数据的 |
对比分析
混合架构常见组合对比
| 组合 | 适用系统 | 优势 | 挑战 |
|---|---|---|---|
| 单体核心 + 微服务边缘 | 银行系统 | 核心稳定+边缘灵活 | 核心和边缘的数据同步 |
| 微服务 + 事件驱动 | 电商平台 | 独立部署+异步解耦 | 事件一致性+调试难度 |
| CQRS + 事件溯源 | 金融/审计系统 | 完整历史+读写优化 | 事件版本演进+高复杂度 |
| 微前端 + BFF + 微服务 | 大型SaaS | 前后端独立+团队自治 | 集成测试+部署协调 |
| Cell-Based + 微服务 | 超大规模系统 | 故障隔离+水平扩展 | 运维复杂度+成本 |
| 单体 + CQRS(仅查询) | 读多写少的系统 | 简单+查询性能好 | 读写模型同步 |
架构风格的兼容性矩阵
| 单体 | 微服务 | 事件驱动 | CQRS | 微内核 | Cell-Based | |
|---|---|---|---|---|---|---|
| 单体 | - | 可共存 | 可集成 | 内部使用 | 可嵌入 | 不适合 |
| 微服务 | 可共存 | - | 天然互补 | 内部使用 | 可嵌入 | 升级路径 |
| 事件驱动 | 可集成 | 天然互补 | - | 天然互补 | 可集成 | 可集成 |
| CQRS | 内部使用 | 内部使用 | 天然互补 | - | 不常见 | 可在Cell内用 |
| 微内核 | 可嵌入 | 可嵌入 | 可集成 | 不常见 | - | 不常见 |
| Cell-Based | 不适合 | 升级路径 | 可集成 | 可在Cell内用 | 不常见 | - |
架构设计实操
实操: 设计"全渠道零售系统"混合架构
业务背景: 一个全渠道零售企业,有线上商城(Web/App)、线下门店(POS)、社交电商(小程序)、B2B批发四个渠道。需要统一的库存、订单、会员、支付能力。团队50人。
Step 1: 模块识别和架构特征分析
| 模块 | 核心特征(Top 3) | 变更频率 | 并发要求 |
|---|---|---|---|
| 用户/会员 | 安全性, 一致性, 可维护性 | 低 | 中 |
| 商品/目录 | 性能(读), 可伸缩性, 可部署性 | 中 | 高(读多写少) |
| 库存 | 一致性, 性能(写), 可用性 | 中 | 高(热点SKU) |
| 订单 | 一致性, 可追踪性, 弹性 | 高 | 高 |
| 支付 | 安全性, 一致性, 可审计性 | 低 | 中 |
| 促销/优惠 | 可部署性, 弹性, 模块化 | 极高 | 高(秒杀) |
| 搜索/推荐 | 性能, 可伸缩性, 可用性 | 中 | 极高 |
| 物流/配送 | 可追踪性, 集成性, 弹性 | 中 | 低 |
| 数据分析 | 性能, 可伸缩性, 延迟容忍 | 低 | 中(批处理) |
| 渠道层(BFF) | 可部署性, 灵活性, 性能 | 极高 | 高 |
Step 2: 决策矩阵和风格选择
| 模块 | 选择的架构风格 | 理由 |
|---|---|---|
| 用户/会员 | 模块化单体 | 低变更+强一致+安全审计集中管理 |
| 商品/目录 | CQRS | 读写比100:1,读需要多维查询,写需要一致性 |
| 库存 | 模块化单体(含热点队列) | 库存扣减需要强一致性,热点SKU用内存排队 |
| 订单 | 微服务 + Saga | 高变更频率+跨服务流程+需要精确追踪 |
| 支付 | 单体模块(与库存共进程) | 强一致性+安全性,和库存在同一事务边界内 |
| 促销/优惠 | 微内核(插件式规则引擎) | 规则极高频变更,需要热加载 |
| 搜索/推荐 | 独立服务 + ElasticSearch | 完全不同的技术栈和伸缩需求 |
| 物流/配送 | 事件驱动 | 天然异步(物流状态更新不需要同步) |
| 数据分析 | 批处理+流处理(Lambda) | 大数据量+实时+批量混合需求 |
| 渠道层 | 微前端 + BFF | 四个渠道独立迭代和部署 |
Step 3: 架构总览
┌─────────────────────────┐
│ 渠道层 (BFF/微前端) │
│ Web │ App │ POS │ 小程序 │
└────────────┬─────────────┘
│
[API Gateway]
(认证/限流/路由/日志)
│
┌───────────────┼───────────────┐
│ │ │
┌───────────▼──┐ ┌────────▼──────┐ ┌─────▼──────┐
│ 订单微服务 │ │ 搜索/推荐 │ │ 物流服务 │
│ (Saga编排) │ │ (独立集群) │ │ (事件驱动) │
└───────┬───────┘ └──────────────┘ └────────────┘
│ Saga
┌───────┼───────────────┐
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────┐
│ 核心单体 (模块化) │
│ ┌──────┬──────┬──────┬───────────┐ │
│ │用户 │库存 │支付 │ 促销规则 │ │
│ │会员 │管理 │记账 │ (微内核) │ │
│ └──────┴──────┴──────┴───────────┘ │
│ 共享数据库(分Schema) │
└──────────────────┬───────────────────┘
│ 事件流
▼
┌──────────────────────┐
│ 数据分析平台 │
│ Kafka → Flink → DW │
└──────────────────────┘
商品/目录:
┌─────────────────────────────┐
│ CQRS │
│ Write: 核心单体的商品模块 │
│ Read: ElasticSearch + Redis │
│ 同步: 通过事件流更新读模型 │
└─────────────────────────────┘
Step 4: 关键集成点设计
| 集成 | 方式 | 一致性 | 理由 |
|---|---|---|---|
| 订单 → 库存 | 同步gRPC(Saga的一步) | 强一致 | 库存扣减必须原子确认 |
| 订单 → 支付 | 同步gRPC(Saga的一步) | 强一致 | 扣款必须原子确认 |
| 订单 → 物流 | 异步消息 | 最终一致 | 物流创建可以延迟几秒 |
| 商品变更 → 搜索索引 | 异步事件 | 最终一致(秒级) | 搜索索引更新延迟可接受 |
| 所有模块 → 数据分析 | 事件流(Kafka) | 最终一致 | 分析不需要实时一致 |
| 促销规则变更 → 订单定价 | 同步(进程内) | 强一致 | 促销和定价在同一个单体内 |
ADR集合:
# ADR-005: 核心模块保留为模块化单体
## 状态: 已接受
## 上下文
用户/库存/支付三个模块之间有强一致性要求。
团队50人中只有20人是后端开发,需要均衡分配到各模块。
## 决策
用户、库存、支付保留在同一个模块化单体中。
## 理由
- 库存扣减和支付扣款经常需要在同一事务中完成
- 用微服务实现需要分布式事务(Saga),增加复杂度
- 这三个模块变更频率低,不需要独立部署
- 模块化单体内部通过Schema隔离,保留未来拆分的可能
## 后果
- 三个模块共享部署节奏
- 通过模块间接口(非数据库直连)保持边界清晰
- 如果未来某个模块需要独立扩展,可以沿模块边界拆分
# ADR-006: 促销模块使用微内核(插件)架构
## 状态: 已接受
## 上下文
促销规则变更极其频繁(运营每天都要调整),且规则类型不断新增
(满减/折扣/买赠/积分/组合优惠)。
## 决策
促销模块使用微内核架构——核心引擎 + 可插拔的规则插件。
## 理由
- 新增促销类型只需要添加插件,不修改核心引擎
- 规则可以热加载(不需要重启服务)
- 规则和核心引擎独立测试
- 运营可以通过配置而非代码修改简单规则
## 后果
- 需要定义清晰的插件接口(规则输入/输出/优先级/互斥性)
- 复杂规则仍需开发者编写插件
- 需要规则冲突检测机制(两个促销规则同时适用时怎么办)
# ADR-007: 商品目录使用CQRS
## 状态: 已接受
## 上下文
商品目录读写比约100:1。读需求:多维筛选、全文搜索、聚合统计。
写需求:商品上下架、价格变更、库存同步。读写模式差异极大。
## 决策
商品目录使用CQRS——写走核心单体的商品模块,
读走ElasticSearch + Redis。通过事件流同步。
## 理由
- 单一模型无法同时满足事务一致性(写)和多维查询(读)
- ElasticSearch天然支持全文搜索和聚合
- Redis缓存热门商品,降低ES压力
- 读模型更新延迟<1秒,业务可接受
## 后果
- 维护两套数据模型(写模型+读模型)
- 事件同步失败时读模型可能暂时不一致(需要补偿机制)
- 商品变更后用户可能1秒内看到旧数据
AI增强实践
AI在混合架构设计中的应用
1. 架构决策矩阵辅助
Prompt: "我的系统有以下模块和特征需求:
[列出模块和特征]
请帮我:
1. 对每个模块推荐2-3种候选架构风格
2. 用决策矩阵评分(1-5)
3. 标出需要特别注意的集成点
4. 检查是否有不兼容的风格组合"
2. ADR审查
Prompt: "以下是我的架构决策记录(ADR):
[粘贴ADR]
请审查:
1. 决策理由是否充分?有没有遗漏的考虑因素?
2. '后果'部分是否全面?
3. 是否有其他应该考虑但没列出的替代方案?
4. 这个决策在什么条件下需要重新审视?"
3. 迁移路径规划
Prompt: "我们当前是单体架构,计划迁移到混合架构。
当前系统: [描述]
目标架构: [描述]
约束: [团队规模/时间/预算]
请帮我:
1. 设计绞杀者模式的迁移路径
2. 确定迁移顺序(先拆什么)
3. 每个阶段的风险和应对
4. 预估各阶段的时间"
AI vs 人工边界:
| 任务 | AI能力 | 人工不可替代 |
|---|---|---|
| 决策矩阵生成和评分 | 优秀 | 特征权重需要业务判断 |
| ADR撰写和审查 | 优秀 | 决策本身需要经验和直觉 |
| 迁移路径规划 | 良好(框架性) | 实际风险评估需要对系统的深度了解 |
| 架构风格兼容性分析 | 优秀 | - |
| 团队能力评估 | 有限 | 对团队文化和能力的了解 |
与Web3/DeFi的关联
| 传统架构概念 | Web3对应 | 关键差异 |
|---|---|---|
| 混合架构 | 链上+链下混合 | Web3天然是混合架构(合约+前端+Indexer) |
| Cell-Based | 多链/分片 | 以太坊分片、Cosmos跨链本质上是Cell |
| 绞杀者迁移 | 协议升级(Proxy) | 链上迁移比传统迁移更痛苦(不可变性) |
| 架构决策矩阵 | 链选择矩阵 | 选L1/L2/侧链也需要类似的决策框架 |
| BFF/API Gateway | RPC聚合层(Moralis/Alchemy) | Alchemy等提供的SDK就是Web3的BFF |
| 事件驱动 | 链上事件+The Graph | 链上天然事件驱动 |
Web3的混合架构模式:
典型DApp的混合架构:
[前端(React/Next.js)]
│
├── 读路径(CQRS的Read Model):
│ └── The Graph / 自建Indexer
│ └── 索引链上事件 → PostgreSQL/ElasticSearch
│
├── 写路径:
│ └── 用户钱包签名 → 直接发到链上合约
│
├── 链下服务(微服务):
│ ├── 用户Profile(中心化存储)
│ ├── 通知服务(Push/Email)
│ └── 数据分析(链上数据+链下数据)
│
└── 链上合约(不可变"单体"):
├── Token合约(ERC-20)
├── 核心协议合约
└── 治理合约
这就是混合架构:
- 链上 = 模块化单体(不可变)
- Indexer = CQRS的Read Model
- 链下 = 微服务
- 前端 = 微前端/SPA
Week 2总结: 个人架构判断力清单
经过Day 8-14的学习,以下是你应该建立的架构判断力:
架构选型判断力
□ 我能根据团队规模和业务约束选择合适的架构风格(Day 8)
□ 我知道何时单体是最优解,何时微服务是错的(Day 8)
□ 我能用架构特征驱动选型,而不是"什么流行用什么"(Day 8)
□ 我能用架构决策矩阵系统化地对比选型方案(Day 14)
DDD判断力
□ 我能识别Bounded Context边界(语言/团队/变更频率)(Day 9)
□ 我能选择正确的Context Mapping关系模式(Day 9)
□ 我知道DDD什么时候不该用(Day 10)
□ 我能识别DDD过度设计的信号(Day 10)
□ 我理解贫血vs充血模型的取舍(Day 10)
□ 我知道Event Sourcing和CQRS的隐藏成本(Day 10)
金融领域建模判断力
□ 我能正确处理金额精度(Money模式)(Day 11)
□ 我能设计复式记账领域模型(Day 11)
□ 我能选择合适的并发控制策略(乐观/悲观/排队)(Day 11)
□ 我能设计幂等性机制(幂等键/状态机)(Day 11)
协作与发现判断力
□ 我能引导Event Storming工作坊(Day 12)
□ 我能从ES产出映射到代码结构(Day 12)
□ 我能识别热点和策略(Day 12)
微服务治理判断力
□ 我知道何时需要Service Mesh(Day 13)
□ 我能设计分布式追踪方案(Day 13)
□ 我能设计熔断/限流/降级策略(Day 13)
□ 我能选择Saga编排vs协调(Day 13)
□ 我能设计API版本演进策略(Day 13)
混合架构判断力
□ 我能识别系统中不同模块的架构风格需求(Day 14)
□ 我能设计混合架构的集成方式(Day 14)
□ 我能用ADR记录架构决策(Day 14)
□ 我能规划从单体到混合架构的迁移路径(Day 14)
□ 我理解Cell-Based Architecture的适用场景(Day 14)
今日思考
-
回顾你做过的系统,它实际上是什么"混合架构"? 可能当时没人这样称呼它,但几乎所有大型系统都是混合的。识别出来后,问自己:这些混合是有意设计的还是无意演化的?无意演化的部分有什么问题?
-
如果让你重新设计当前的系统,你会做出什么不同的架构决策? 用本周学的决策矩阵重新评估。哪些模块的风格需要调整?哪些边界需要移动?
-
Web3的"链上不可变+链下灵活"模式,是否启示了一种新的混合架构范式? 传统系统的所有组件都可以修改和演进,但Web3的核心逻辑(链上合约)一旦部署就很难改变。这种"不可变核心+可变边缘"的模式,在传统系统设计中有什么借鉴意义?
面试题准备
Q1: 你做过最复杂的架构决策是什么?
30秒版本: 在一个零售金融系统中,我决定将核心记账保留为单体、将订单和渠道拆为微服务、将数据分析用CQRS+事件流实现。关键挑战是在"一致性"和"独立部署"之间找到平衡——记账必须强一致所以不能拆,渠道必须独立迭代所以必须拆。
2分钟版本:
背景:一个零售金融系统,支持贷款、理财、支付,有Web和App两个渠道。团队30人,原来是单体,遇到了部署频率低(每次发版影响全系统)和渠道迭代慢(改App端需要和后端一起发版)的问题。
我的决策过程:
第一步,识别架构量子。通过分析变更频率和一致性需求,将系统分成了4个量子:核心金融引擎(记账+风控)、业务流程层(贷款/理财/支付的状态机)、渠道层(Web/App)、数据分析。
第二步,用决策矩阵选型。核心金融引擎需要强一致性和安全审计→保留单体;业务流程层需要独立部署和灵活编排→微服务+Saga;渠道层需要独立迭代→微前端+BFF;数据分析读写比极高→CQRS+Kafka。
第三步,设计集成方式。核心引擎对外暴露gRPC接口(性能优先),业务流程层通过Saga编排调用核心引擎,渠道层通过BFF聚合多个微服务的数据,数据分析通过Kafka消费所有模块的事件。
最复杂的取舍是:核心引擎内部要不要也拆成微服务。记账团队想拆(独立部署),风控团队想拆(独立技术栈)。但我分析后决定不拆——记账和风控需要在同一事务中完成(贷款审批时风控通过→立刻冻结资金),拆了就需要分布式事务,风险和复杂度远大于收益。我用ADR记录了这个决策和预期的验证条件(如果未来团队超过50人且并发需求增长10倍,则重新评估)。
追问准备:
追问: "如果一个系统中用了多种架构风格,团队怎么维护?" 回答: 三个关键点。第一,明确每个模块的"架构所有者"——谁对这个模块的架构决策负责。第二,用ADR记录所有关键决策——新人入职后看ADR就能理解"为什么这样设计"。第三,定期的架构审查——每季度检查各模块的架构是否仍然适合当前的业务需求,是否需要调整。
Q2: 如何在一个系统中混合多种架构风格?
30秒版本: 三个原则:第一,按架构量子划分——每个量子选择最适合自己特征需求的风格;第二,明确集成方式——同步调用、异步事件、共享数据的边界要清晰;第三,用ADR记录每个选择——为什么这个模块用这种风格而不是那种。核心是"有原则的混合"而不是"随意的混合"。
2分钟版本:
混合架构的关键在于"有纪律的多样性"。
首先,确定混合的边界。用架构量子的概念——每个能独立部署、有自己数据的组件就是一个量子,每个量子可以选择最合适的风格。量子之间通过明确的契约(API/事件)通信,不共享内部实现。
其次,设计集成模式。混合架构的难点不在于各模块内部,而在于模块之间的集成。我会为每对集成设计明确的通信方式:需要实时响应的用同步RPC,可以延迟的用异步消息,需要大量数据的用事件流。关键原则是避免数据库集成(两个模块不能共享表)。
第三,管理认知负荷。团队中不是每个人都需要理解所有风格。我会让每个团队专注于自己负责的模块的风格,但所有人都需要理解集成方式。平台工程团队负责维护基础设施(消息队列/API网关/监控),让业务团队聚焦业务。
最后,持续演进。混合架构不是一次设计完的。系统上线后,我们会监控各模块的健康状况——如果某个模块的架构风格不再适合当前需求(比如读写比变了导致CQRS不再必要),就调整。关键是模块边界设计得好,调整时不影响其他模块。
学习资源
- 《Fundamentals of Software Architecture》 - Mark Richards & Neal Ford - 架构量子和混合架构的理论基础
- 《Software Architecture: The Hard Parts》 - Neal Ford et al. - 专门讲架构权衡和决策
- 蚂蚁金服技术博客 - Cell-Based Architecture的中文实践
- Martin Fowler - "StranglerFigApplication" - 绞杀者模式的原始文章
- Simon Brown - "Modular Monolith" - 模块化单体的实战指南
- ADR GitHub - https://adr.github.io/ - Architecture Decision Records的标准和工具
Week 3预告
Week 2我们从"会用"到"会选"——建立了架构风格选型、DDD战略战术、金融建模、Event Storming、微服务治理、混合架构的完整知识体系。
Week 3将进入"会演进"的阶段——分布式系统核心:
- 分布式一致性(CAP/PACELC)
- 分布式数据管理(Saga/事件溯源/最终一致性)
- 可观测性工程(Metrics/Logs/Traces的三支柱)
- 混沌工程(从理论到实践)
- 性能工程(从瓶颈分析到容量规划)
- 云原生架构模式(12-Factor/Serverless/Edge Computing)
- 架构评审方法(ATAM/轻量级ADR流程)
Week 3的关键转变是:从"在白板上设计好架构"到"让架构在生产环境中可靠运行"。