Featured image of post 软件架构风格对比 + 效用树答题套路

软件架构风格对比 + 效用树答题套路

软件架构风格对比 + 效用树答题套路

系统架构师考试 | 架构设计核心专题 对应 2021 年下半年案例分析 试题一 Q1、Q2 阅读时长:约 15 分钟

前言

软件架构风格是系统架构师考试的"重头戏"——选择题 3-5 分、案例题 15-25 分。两大必考技能

  1. 识别风格:给定业务场景,判断该用哪种架构风格
  2. 效用树:从需求描述里识别质量属性,填效用树

本篇系统讲解:经典 5 大架构风格、解释器 / 管道-过滤器 / 隐式调用对比、效用树答题套路、机器学习平台实战。


一、经典 5 大架构风格

软件架构风格的"五元素分类"(Garlan & Shaw 1994):

类别代表风格核心特征
数据流管道-过滤器、批处理数据在组件间流动
调用-返回主程序-子程序、面向对象、层次控制流在调用栈中
独立构件进程通信、事件驱动组件通过消息/事件通信
虚拟机解释器、规则系统自定义 DSL 由虚拟机执行
仓库数据库系统、黑板共享数据存储 + 独立组件

二、3 种风格详细对比(2021 真题)

题目:机器学习应用开发平台——用户拖拽算法组件定义 ML 流程,可开发新算法组件加入。

  • 赵工 建议:解释器
  • 李工 建议:管道-过滤器
  • 王工 建议:隐式调用

2.1 解释器(Interpreter)

定义:构建一个虚拟机,执行用户自定义的"语言/DSL"。

架构示意

1
2
3
4
5
6
7
8
┌─────────────────────────┐
│   解释器(虚拟机)        │
│  ┌─────────┐ ┌────────┐ │
│  │ 状态机  │ │ 执行器 │ │
│  └─────────┘ └────────┘ │
└─────────────────────────┘
    DSL 脚本输入

优点

  • 灵活性极高:可表达任意复杂逻辑
  • 可定制:用户自己定义业务规则

缺点

  • 用户需学习 DSL 语法(门槛高)
  • 性能开销(解释执行)
  • 新增算法需修改解释器核心(扩展性差)

典型应用

  • SQL 引擎、JavaScript 引擎
  • 业务规则引擎(Drools、Aviator)
  • 工作流引擎(Activiti、Camunda)
  • ETL 工具(Kettle、Airflow DAG)

2.2 管道-过滤器(Pipe-and-Filter)

定义:每个组件是过滤器,数据在过滤器之间单向流动

架构示意

1
2
输入 → [过滤器1] → [过滤器2] → [过滤器3] → 输出
       数据清洗    特征提取     模型训练

优点

  • 拖拽式定义流程天然契合(过滤器 + 连接 = 流程图)
  • 可扩展性极好:新增算法 = 新增过滤器(符合开闭原则)
  • 各过滤器独立开发、测试、复用
  • 易实现并行(无依赖的过滤器并行执行)

缺点

  • 数据序列化/反序列化有开销
  • 不适合状态共享场景(每个过滤器只看自己输入)
  • 调试相对困难(数据在多个过滤器间流转)

典型应用

  • Unix Shellcat file | grep xxx | sort | uniq
  • 编译器(词法分析 → 语法分析 → 语义分析 → 中间代码 → 目标代码)
  • 数据处理(Spark、Flink、MapReduce)
  • 机器学习平台(TensorFlow、scikit-learn Pipeline、MLflow)

2.3 隐式调用 / 事件驱动(Implicit Invocation / Event-Driven)

定义:组件不直接调用其他组件,而是注册事件 / 发布订阅

架构示意

1
2
3
事件源 ──发事件──> 事件总线 ──派发──> 监听者A
                              └──> 监听者B
                              └──> 监听者C

优点

  • 松耦合:组件间不直接依赖
  • 可扩展性好:新增算法只需注册监听器
  • 适合异步广播场景

缺点

  • 事件流不直观,难理解整体流程
  • 事件命名空间管理难(重名/版本)
  • 调试复杂(事件流难追踪)
  • 性能损耗(事件总线)

典型应用

  • GUI 系统(按钮点击 → 多个监听器响应)
  • 消息队列(Kafka、RabbitMQ、Pulsar)
  • 观察者模式(Vue/React 响应式)
  • EDA(Event-Driven Architecture)
  • Serverless(AWS Lambda 事件触发)

2.4 三者对比表(必背)

维度解释器管道-过滤器隐式调用
流程灵活性高(DSL 描述)(拖拽)中(事件流)
算法可扩展性差(改核心)(加过滤器)好(注册监听器)
用户门槛高(学 DSL)(拖拽)中(理解事件)
并行性(无依赖可并行)好(异步)
调试难度
典型应用规则引擎、工作流数据处理、ML 平台GUI、消息队列

2.5 2021 真题答案

该平台更适合:管道-过滤器(李工方案)

理由:

  1. “拖拽算法组件定义流程” = 数据在多个组件间流动 = 管道-过滤器天然契合
  2. 算法的可扩展 = 新增过滤器,符合开闭原则
  3. 各算法组件独立开发、测试、复用
  4. 解释器需要用户写脚本,不适合"自助拖拽"
  5. 隐式调用的事件流对普通用户不直观

三、现代主流架构风格(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 风格选型决策树

1
2
3
4
5
6
7
8
9
需要自定义业务规则?
  ├─ 是 → 解释器 / 规则引擎
  └─ 否 → 数据流处理?
            ├─ 是 → 管道-过滤器
            └─ 否 → 需要异步解耦?
                      ├─ 是 → 事件驱动 / 消息队列
                      └─ 否 → 复杂业务系统?
                                ├─ 是 → 微服务 / DDD
                                └─ 否 → 简单业务 → 主程序-子程序 / 层次式

四、效用树(Utility Tree)答题套路

效用树是质量属性评估的核心工具——把系统的质量需求结构化优先级化

4.1 效用树结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
效用(Utility)
├── 可用性
│   ├── (e) 主站点宕机 15 秒发现错误并启用备用
│   └── (3) [待选]
├── 性能
│   ├── (f) 流程提交到执行 ≤ 5 秒
│   └── (j) 0.5 秒内响应界面操作
├── 安全性
│   ├── (b) 数据库保护措施
│   └── (h) 详细记录所有用户操作
└── 可修改性
    ├── (g) 3 人天完成硬件扩容
    └── (i) 3 人天完成界面风格修改

4.2 质量属性六大类

质量属性关注点典型描述关键词
可用性(Availability)系统能正常提供服务“X 秒内恢复"“MTTF"“MTTR"“备用”
性能(Performance)响应时间、吞吐量“X 秒内响应"“TPS"“并发”
安全性(Security)机密性、完整性、不可否认性“防非授权"“审计"“加密"“权限”
可修改性(Modifiability)易修改、易扩展“X 人天修改"“升级"“扩容”
易用性(Usability)用户体验“学习成本"“界面友好"“新手”
可移植性(Portability)跨平台“兼容"“跨平台"“与 X 一致”

4.3 答题 4 步法

  1. 识别场景:题干里"系统做什么”——快速定位业务领域
  2. 抽取描述:题目 (a)-(l) 里的关键数字/动词
  3. 归类映射:把每个描述分到六大属性之一
  4. 填图填表:按 (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/
使用 Hugo 构建
主题 StackJimmy 设计