软件架构风格对比 + 效用树答题套路
系统架构师考试 | 架构设计核心专题 对应 2021 年下半年案例分析 试题一 Q1、Q2 阅读时长:约 15 分钟
前言
软件架构风格是系统架构师考试的"重头戏"——选择题 3-5 分、案例题 15-25 分。两大必考技能:
- 识别风格:给定业务场景,判断该用哪种架构风格
- 效用树:从需求描述里识别质量属性,填效用树
本篇系统讲解:经典 5 大架构风格、解释器 / 管道-过滤器 / 隐式调用对比、效用树答题套路、机器学习平台实战。
一、经典 5 大架构风格
软件架构风格的"五元素分类"(Garlan & Shaw 1994):
| 类别 | 代表风格 | 核心特征 |
|---|---|---|
| 数据流 | 管道-过滤器、批处理 | 数据在组件间流动 |
| 调用-返回 | 主程序-子程序、面向对象、层次 | 控制流在调用栈中 |
| 独立构件 | 进程通信、事件驱动 | 组件通过消息/事件通信 |
| 虚拟机 | 解释器、规则系统 | 自定义 DSL 由虚拟机执行 |
| 仓库 | 数据库系统、黑板 | 共享数据存储 + 独立组件 |
二、3 种风格详细对比(2021 真题)
题目:机器学习应用开发平台——用户拖拽算法组件定义 ML 流程,可开发新算法组件加入。
- 赵工 建议:解释器
- 李工 建议:管道-过滤器
- 王工 建议:隐式调用
2.1 解释器(Interpreter)
定义:构建一个虚拟机,执行用户自定义的"语言/DSL"。
架构示意:
| |
优点:
- 灵活性极高:可表达任意复杂逻辑
- 可定制:用户自己定义业务规则
缺点:
- 用户需学习 DSL 语法(门槛高)
- 性能开销(解释执行)
- 新增算法需修改解释器核心(扩展性差)
典型应用:
- SQL 引擎、JavaScript 引擎
- 业务规则引擎(Drools、Aviator)
- 工作流引擎(Activiti、Camunda)
- ETL 工具(Kettle、Airflow DAG)
2.2 管道-过滤器(Pipe-and-Filter)
定义:每个组件是过滤器,数据在过滤器之间单向流动。
架构示意:
| |
优点:
- 拖拽式定义流程天然契合(过滤器 + 连接 = 流程图)
- 可扩展性极好:新增算法 = 新增过滤器(符合开闭原则)
- 各过滤器独立开发、测试、复用
- 易实现并行(无依赖的过滤器并行执行)
缺点:
- 数据序列化/反序列化有开销
- 不适合状态共享场景(每个过滤器只看自己输入)
- 调试相对困难(数据在多个过滤器间流转)
典型应用:
- Unix Shell(
cat file | grep xxx | sort | uniq) - 编译器(词法分析 → 语法分析 → 语义分析 → 中间代码 → 目标代码)
- 数据处理(Spark、Flink、MapReduce)
- 机器学习平台(TensorFlow、scikit-learn Pipeline、MLflow)
2.3 隐式调用 / 事件驱动(Implicit Invocation / Event-Driven)
定义:组件不直接调用其他组件,而是注册事件 / 发布订阅。
架构示意:
| |
优点:
- 松耦合:组件间不直接依赖
- 可扩展性好:新增算法只需注册监听器
- 适合异步、广播场景
缺点:
- 事件流不直观,难理解整体流程
- 事件命名空间管理难(重名/版本)
- 调试复杂(事件流难追踪)
- 性能损耗(事件总线)
典型应用:
- GUI 系统(按钮点击 → 多个监听器响应)
- 消息队列(Kafka、RabbitMQ、Pulsar)
- 观察者模式(Vue/React 响应式)
- EDA(Event-Driven Architecture)
- Serverless(AWS Lambda 事件触发)
2.4 三者对比表(必背)
| 维度 | 解释器 | 管道-过滤器 | 隐式调用 |
|---|---|---|---|
| 流程灵活性 | 高(DSL 描述) | 高(拖拽) | 中(事件流) |
| 算法可扩展性 | 差(改核心) | 好(加过滤器) | 好(注册监听器) |
| 用户门槛 | 高(学 DSL) | 低(拖拽) | 中(理解事件) |
| 并行性 | 中 | 好(无依赖可并行) | 好(异步) |
| 调试难度 | 中 | 中 | 难 |
| 典型应用 | 规则引擎、工作流 | 数据处理、ML 平台 | GUI、消息队列 |
2.5 2021 真题答案
该平台更适合:管道-过滤器(李工方案)
理由:
- “拖拽算法组件定义流程” = 数据在多个组件间流动 = 管道-过滤器天然契合
- 算法的可扩展 = 新增过滤器,符合开闭原则
- 各算法组件独立开发、测试、复用
- 解释器需要用户写脚本,不适合"自助拖拽"
- 隐式调用的事件流对普通用户不直观
三、现代主流架构风格(2024+)
3.1 经典风格仍是大纲必考
| 风格 | 核心思想 | 2024 实践 |
|---|---|---|
| 微服务(Microservices) | 单一职责 + 独立部署 | Spring Cloud、Dubbo、Service Mesh |
| 事件驱动(EDA) | 异步消息解耦 | Kafka、Pulsar、EventBridge |
| Serverless / FaaS | 函数即服务 | AWS Lambda、阿里 FC、Cloud Functions |
| 云原生(Cloud Native) | 12 要素 + 容器化 | Kubernetes、Istio、Knative |
| CQRS + Event Sourcing | 读写分离 + 事件溯源 | Axon、EventStoreDB |
| Mesh 化(Service Mesh) | Sidecar 代理通信 | Istio、Linkerd、Consul Connect |
3.2 风格选型决策树
| |
四、效用树(Utility Tree)答题套路
效用树是质量属性评估的核心工具——把系统的质量需求结构化、优先级化。
4.1 效用树结构
| |
4.2 质量属性六大类
| 质量属性 | 关注点 | 典型描述关键词 |
|---|---|---|
| 可用性(Availability) | 系统能正常提供服务 | “X 秒内恢复"“MTTF"“MTTR"“备用” |
| 性能(Performance) | 响应时间、吞吐量 | “X 秒内响应"“TPS"“并发” |
| 安全性(Security) | 机密性、完整性、不可否认性 | “防非授权"“审计"“加密"“权限” |
| 可修改性(Modifiability) | 易修改、易扩展 | “X 人天修改"“升级"“扩容” |
| 易用性(Usability) | 用户体验 | “学习成本"“界面友好"“新手” |
| 可移植性(Portability) | 跨平台 | “兼容"“跨平台"“与 X 一致” |
4.3 答题 4 步法
- 识别场景:题干里"系统做什么”——快速定位业务领域
- 抽取描述:题目 (a)-(l) 里的关键数字/动词
- 归类映射:把每个描述分到六大属性之一
- 填图填表:按 (1)(2)(3)(4)(5)(6) 顺序填入
4.4 关键字速查表
| 看到这些词 | 归到 |
|---|---|
| “X 秒内响应"“TPS"“并发” | 性能 |
| “X 秒内恢复"“宕机"“备用"“故障转移” | 可用性 |
| “防非授权"“审计"“加密"“权限” | 安全性 |
| “X 人天修改"“升级"“扩容"“界面改” | 可修改性 |
| “新手"“学习成本"“界面友好” | 易用性 |
| “兼容"“跨平台"“与 X 一致” | 可移植性 |
4.5 2021 真题演练
题干(机器学习平台):
(a) 三种角色不同界面 → 可修改性 (b) 数据库保护 → 安全 (c) 主站点断电 20 秒重定向 → 可用性 (d) 初学者/高级两种模式 → 可修改性 (e) 15 秒发现错误 → 可用性 (f) 流程提交到执行 ≤ 5 秒 → 性能 (g) 3 人天硬件扩容 → 可修改性 (h) 详细记录操作(审计) → 安全 (i) 3 人天界面修改 → 可修改性 (j) 0.5 秒响应界面操作 → 性能 (k) 与主流平台界面风格一致 → 可移植性 (l) 远程调试支持 → 可修改性
效用树答案:
| 编号 | 答案 | 理由 |
|---|---|---|
| (1) | 性能 | 下挂 (f) |
| (2) | 可修改性 | 下挂 (g) |
| (3) | (e) | 15 秒发现错误——可用性 |
| (4) | (j) | 0.5 秒响应——性能(注:原题 a-i 笔误) |
| (5) | (h) | 详细记录操作——安全 |
| (6) | (i) | 3 人天界面修改——可修改性 |
五、实战:4 种典型业务的风格选型
| 业务 | 选型 | 理由 |
|---|---|---|
| 机器学习平台 | 管道-过滤器 | 拖拽 + 可扩展 |
| 规则引擎(风控、定价) | 解释器 | 业务规则频繁变化 |
| 电商订单 | 事件驱动 | 异步解耦、削峰 |
| 银行核心系统 | 微服务 + CQRS | 高可用 + 强一致 |
| 数据中台 | 管道-过滤器 + 数据仓库 | ETL 流水线 |
| 工作流引擎 | 解释器 + 状态机 | 流程自定义 |
六、2024+ 视角
6.1 架构风格融合
现代系统很少用单一风格——通常是多种风格的组合:
- 微服务 + 事件驱动:服务间用事件解耦(Spring Cloud + Kafka)
- Serverless + CQRS:函数计算 + 读写分离
- 云原生 + Mesh:K8s 编排 + Istio 通信
- DDD + 微服务:限界上下文 = 微服务边界
6.2 架构风格评估方法
- ATAM(架构 tradeoff 分析方法):识别质量属性 → 分析决策 → 评估风险
- CBAM(成本效益分析法):量化架构决策的 ROI
- SAAM(软件架构分析方法):场景驱动的早期评估
- ADD(属性驱动设计):以质量属性为输入设计架构
6.3 软考答题趋势
- 2024+ 案例题经常给 3 个方案(赵工/李工/王工),让你对比 + 选一个
- 不仅要答选哪种,还要答理由——分"灵活性/可扩展性/性能/复杂度"等维度
- 效用树考频大幅上升——几乎每年必考
- 现代风格(微服务/云原生)开始进入考纲
七、答题套路总结
| 题型 | 套路 |
|---|---|
| 风格对比题 | 答"灵活性 / 可扩展性 / 性能 / 复杂度 / 适用” 5 个维度 |
| 风格选型题 | 业务特征 → 风格映射(见 4.2 决策树) |
| 效用树填空 | 关键字法(性能/可用性/安全/可修改性/易用性/可移植性) |
| 三方案对比 | 每个方案优点 + 缺点,最后选一个 + 理由 |
八、架构风格速记口诀
“数据流调用返,独立构件和仓库;解释器是虚拟机”
- 数据流:管道-过滤器、批处理
- 调用-返回:主程序-子程序、OO、层次
- 独立构件:进程通信、事件驱动
- 仓库:数据库、黑板
- 虚拟机:解释器、规则系统
参考资料
- 2021 年下半年系统架构设计师考试真题(下午案例分析 试题一 Q1、Q2)
- 《系统架构设计师教程》第 9-10 章 软件架构概念 + 系统质量属性与架构评估
- 《Software Architecture: Perspectives on an Emerging Discipline》 Mary Shaw、David Garlan
- 《Clean Architecture》 Robert C. Martin
- 《微服务架构设计模式》 Chris Richardson
- 《凤凰架构》 周志明
- CNCF 云原生定义 https://www.cncf.io/
- ATAM 评估方法 https://www.sei.cmu.edu/library/architectural-tradeoff-analysis-method-atam/
