软考
架构核心速查表
软件架构设计核心:架构风格对比、质量属性战术、ATAM/SAAM 评估流程——案例第1题必考,论文高频素材
一句话定位
本表覆盖软考 §3.7 软件架构设计(核心高频),是案例第 1 题必考内容(架构风格 + 质量属性效用树),也是论文高频素材来源。要求做到核心表与流程图可默写。
IMPORTANT
- 案例第 1 题高频模式:给出一个系统的架构描述,要求①判断/选择架构风格;②画出/补全质量属性效用树;③针对某一质量属性提出改进方案。
- 本系列最高价值产出,务必精确记忆。
A. 软件架构基础概念
A.1 组成要素
| 要素 | 定义 | 示例 |
|---|---|---|
| 构件(Component) | 系统中可独立部署、替换的基本单元 | 模块、类、服务、组件 |
| 连接件(Connector) | 构件之间的交互机制与规则 | 消息传递、RPC、消息队列、共享内存 |
| 约束(Constraint) | 构件与连接件之间的限制条件 | 接口规范、协议、调用顺序、拓扑规则 |
NOTE
架构 = 构件 + 连接件 + 约束。三要素在面试/论文中可作为”架构定义”的规范表述。
A.2 架构复用与产品线
| 概念 | 定义 | 核心要素 | 考试要点 |
|---|---|---|---|
| 软件架构复用 | 在不同系统中重用已有的架构设计、构件或文档 | 领域知识、架构模板、可复用构件库 | 降低开发成本、提高质量 |
| DSSA(特定领域软件架构) | 针对某一特定应用领域抽取通用架构 | 领域分析 → 领域设计 → 领域实现;产出参考需求 + 参考架构 | DSSA 四阶段常考选择题 |
| 软件产品线(SPL) | 基于一组共享的核心资产,通过配置/定制生成一系列相关产品 | 核心资产(构件、架构、文档)+ 产品配置 | 与 DSSA 的关系:SPL 是实现架构复用的组织级实践 |
B. 架构风格完整对比表
数据来源:《系统架构设计师教程(第 2 版)》§3.7;案例第 1 题核心判题依据。
B.1 传统六大类架构风格
| 大类 | 子风格 | 组成/原理 | 优点 | 缺点 | 典型例子 |
|---|---|---|---|---|---|
| 数据流 | 批处理序列 | 数据批量流动,每个步骤完整处理全部数据后再传给下一步 | 简单、吞吐高 | 延迟大、无法交互 | 编译器后端(链接阶段)、ETL 数据清洗 |
| 数据流 | 管道-过滤器 (Pipe-Filter) | 前置输出 → 后置输入,增量式流处理 | 流式处理、可并行、易复用、灵活性高 | 难处理交互式场景、错误恢复困难 | Unix 管道、编译器四阶段流水线 |
| 调用/返回 | 主程序-子程序 | 分解为若干模块,通过过程调用组织 | 结构清晰、直观易懂 | 扩展性差、耦合度高 | 传统 C 程序、早期结构化编程 |
| 调用/返回 | 面向对象 | 对象封装数据与行为,通过消息传递交互 | 封装性好、易复用、易维护 | 对象间依赖复杂、需唯一标识(OID) | Java/C# 企业应用 |
| 调用/返回 | 层次结构 (Layered) | 分层,每层只调用相邻下层服务 | 支持扩展、复用、可移植性好 | 跨层调用破坏分层(应严格禁止) | OSI 七层协议栈、操作系统内核 |
| 独立构件 | 进程通信 | 进程间显式通信(消息/信号/共享内存) | 松耦合、独立部署 | 性能开销、通信延迟 | RPC、消息队列、Socket |
| 独立构件 | 事件驱动 / 隐式调用 (Event-Driven) | 构件注册/订阅事件,事件触发时隐式调用 | 高度松耦、可动态扩展、支持运行时变化 | 控制流难追踪、调试困难 | GUI 框架(Swing/Qt)、MQ、MVC |
| 虚拟机 | 解释器 (Interpreter) | 解释引擎 + 被解释程序,逐条解释执行 | 灵活、可移植、易扩展 | 性能低、资源占用大 | JVM、SQL 引擎、正则表达式引擎 |
| 虚拟机 | 基于规则系统 (Rule-Based) | 规则库 + 规则解释器 + 工作内存 | 适合知识推理、易修改规则 | 规则冲突难处理、性能低 | Prolog、Drools、专家系统 |
| 仓库 | 数据库系统 | 中央数据存储 + 独立构件读写 | 数据集中管理、一致性好 | 中心瓶颈、扩展受限 | RDBMS 应用、ERP 系统 |
| 仓库 | 黑板系统 (Blackboard) | 知识源 + 黑板(共享数据区) + 控制器 | 适合不确定性问题求解、可增量求解 | 控制复杂、效率难保证 | 语音识别(HEARSAY-II)、图像识别、AI 推理 |
WARNING
易混区分:
- 管道-过滤器 vs 批处理:管道-过滤器是增量流式(数据像流水一样逐条通过);批处理是批量(全部数据处理完再传递)。考试常给场景让判断属于哪种风格。
- 黑板系统三要素:①知识源(Knowledge Source);②黑板(Blackboard,共享数据区);③控制器(Controller,协调知识源)。三要素缺一不可,是高频填空/选择题考点。
B.2 现代派生风格(高频延伸)
| 风格 | 核心特征 | 来源/定位 |
|---|---|---|
| C/S (Client/Server) | 客户端请求 → 服务端响应 | 两层/三层经典架构 |
| B/S (Browser/Server) | 浏览器作为通用客户端、零部署 | Web 1.0 时代主流 |
| N-tier / 多层架构 | 表示层/业务层/数据层分离 | 企业应用标准架构 |
| MVC / MVP / MVVM | 视图与模型分离 | GUI/Web 前端架构模式 |
| SOA (Service-Oriented) | 松耦合服务,通过 ESB 集成 | 重量级企业服务架构 |
| REST | HTTP 语义化操作(GET/POST/PUT/DELETE) | 轻量级 Web API 架构风格 |
| 微服务 (Microservices) | 细粒度服务拆分、独立部署、DevOps | 现代分布式系统主流 |
| 云原生 (Cloud Native) | 微服务 + 容器 + DevOps + 持续交付 | 云计算时代架构范式 |
| EDA (Event-Driven Architecture) | 事件驱动、异步通信、松耦合 | IoT/实时流处理/high scalabale 系统 |
| RIA (Rich Internet Applications) | 富客户端交互、AJAX/SPA | 现代 Web 应用 |
B.3 架构风格对比速记
| 对比维度 | 风格 A | 风格 B | 核心差异 |
|---|---|---|---|
| 数据流方式 | 管道-过滤器(增量流式) | 批处理(全量批量) | 是否逐条处理数据 |
| 调用方式 | 显式调用(主程序/面向对象) | 隐式调用(事件驱动) | 调用关系是否可见 |
| 耦合度 | 紧耦合(主程序-子程序) | 松耦合(事件驱动/进程通信) | 构件间依赖程度 |
| 控制流 | 集中式(主程序) | 分布式(事件驱动) | 控制逻辑在哪里 |
C. 质量属性与战术清单(Case 必默写)
C.1 质量属性场景六要素
场景 = 刺激源 + 刺激 + 制品 + 环境 + 响应 + 响应度量
| 要素 | 含义 | 示例 |
|---|---|---|
| 刺激源 | 引发质量属性问题的来源 | 用户请求、故障、黑客攻击 |
| 刺激 | 具体的刺激事件 | 并发请求 1000/s、服务器宕机、SQL 注入 |
| 制品 | 被刺激的系统部分 | 数据库服务、Web 服务网关、缓存层 |
| 环境 | 刺激发生时的系统状态 | 正常负载/高负载/降级模式 |
| 响应 | 系统如何响应刺激 | 返回结果/切换备用/熔断降级 |
| 响应度量 | 响应效果的量化指标 | 响应时间 < 200ms、可用性 ≥ 99.9% |
C.2 效用树 (Utility Tree)
效用树是 ATAM 评估的核心工具,用于优先级排序:
根节点:软件质量属性
├── 可用性 (Availability)
│ ├── 故障检测时间 < 30s (H, M) ← (重要性, 实现难度)
│ └── 故障恢复时间 < 60s (H, L)
├── 性能 (Performance)
│ ├── 并发 1000/s 响应 < 200ms (H, H)
│ └── 资源利用率 < 80% (M, M)
├── 安全性 (Security)
│ └── …
└── 可修改性 (Modifiability)
└── …
IMPORTANT
- 效用树对每个场景标注
(重要性, 实现难度),常用 H/M/L 表示 - 案例第 1 题常考:给场景让补全/修正效用树,或给出效用树让分析架构是否满足要求
C.3 质量属性 × 战术 完整对照
必背:每个质量属性至少记住 3~4 个核心战术,案例问答题直接套用。
可用性 (Availability)
| 分类 | 战术 | 说明 | 案例常见用法 |
|---|---|---|---|
| 错误检测 | Ping / Echo | 周期性探测服务是否存活 | 心跳检测 |
| Heartbeat | 服务间定期发送心跳包 | 微服务健康检查 | |
| Exception | 捕获异常并报警 | try-catch + 警报 | |
| 错误恢复 | 主动冗余(热备) | 主备同时运行,主故障秒切 | 数据库主从热备 |
| 被动冗余(暖备) | 备机运行但不处理请求,主故障后接管 | 应用服务主备 | |
| 备件(Spare) | 准备替换部件 | 服务器备机 | |
| 表决(Voting) | 多副本结果投票,取多数 | 分布式一致性 | |
| 状态再同步 | 故障恢复后与主状态一致 | 主备数据同步 | |
| 回滚(Rollback) | 事务失败回滚到之前状态 | 数据库事务 | |
| 降级(Graceful Degradation) | 关闭非核心功能保核心业务 | 双 11 关闭评论 | |
| 重试(Retry) | 失败后自动重试 | 幂等接口重试 | |
| 错误预防 | 服务从服务中移除 | 故障实例自动下线 | 健康检查失败下线 |
| 事务(Transactions) | ACID 保证操作原子性 | 数据库事务 | |
| 进程监视器 | 进程异常自动重启 | Kubernetes 自动重启 |
可修改性 (Modifiability)
| 分类 | 战术 | 说明 |
|---|---|---|
| 局部化修改 | 维持语义一致性 | 模块接口与实现语义一致 |
| 模块分解 | 大拆小,减少变更影响范围 | |
| 模块通用化 | 提取通用模块,一处修改多处受益 | |
| 预期期望变更 | 预留扩展点 | |
| 防止连锁反应 | 信息隐藏 | 隐藏实现细节 |
| 接口与实现分离 | 面向接口编程 | |
| 维持现有接口 | 向后兼容 | |
| 限制通信路径 | 减少模块间直接依赖 | |
| 使用中介者 | 中介者模式减少直接耦合 | |
| 推迟绑定时间 | 运行时注册 | 插件/服务发现 |
| 配置文件 | 配置驱动,不修改代码 | |
| 多态 | 延迟绑定到运行时才确定 | |
| 组件替换 | 热插拔组件 | |
| 遵守已发布协议 | 标准化接口 |
性能 (Performance)
| 分类 | 战术 | 说明 | 案例常见用法 |
|---|---|---|---|
| 资源需求 | 提高计算效率 | 优化算法 | 缓存热点数据 |
| 减少计算开销 | 避免冗余计算 | 惰性求值 | |
| 管理事件率 | 限流/降级 | 令牌桶限流 | |
| 控制采样频率 | 仅处理部分数据 | 日志采样 | |
| 资源管理 | 引入并发 | 多线程/多进程 | 线程池 |
| 维持数据/计算多副本 | 读写分离 | 主从数据库 | |
| 增加资源 | 垂直/水平扩展 | 扩容服务器 | |
| 资源仲裁(调度) | FIFO | 先进先出 | 任务队列 |
| 固定优先级 | 高优先级优先 | 实时系统 | |
| 动态优先级 | 轮转/抢占 | 时间片轮转 | |
| SJF | 短作业优先 | 批处理系统 |
TIP
性能战术速记口诀:“提效率、减开销、管速率、控采样;引并发、多副本、加资源;调度看 FIFO/优先级/SJF”
安全性 (Security)
| 分类 | 战术 | 说明 | 案例常见用法 |
|---|---|---|---|
| 抵抗攻击 | 身份验证(认证) | 确认用户身份 | 用户名密码、OAuth、SSO |
| 用户授权 | 确认用户权限 | RBAC 角色权限 | |
| 数据加密 | 传输/存储加密 | HTTPS / AES | |
| 限制访问 | 防火墙、ACL | IP 白名单 | |
| 维护数据完整性 | 哈希校验 | SHA-256、数字签名 | |
| 检测攻击 | 入侵检测(IDS/IPS) | 检测异常行为 | WAF、SIEM |
| 异常行为检测 | 基于规则/机器学习 | 风控系统 | |
| 从攻击中恢复 | 审计跟踪(Audit Trail) | 全量操作日志 | 审计日志 |
| 恢复 | 备份恢复 | 数据备份/快照 |
可测试性 (Testability)
| 分类 | 战术 | 说明 |
|---|---|---|
| 输入/输出管理 | 录制/回放(Record/Playback) | 记录输入输出用于回放测试 |
| 接口与实现分离 | 测试时替换成 Mock/Stub | |
| 内部监视 | 内置监视器 | 内嵌健康检查、性能计数器 |
易用性 (Usability)
| 分类 | 战术 | 说明 |
|---|---|---|
| 运行时战术 | 任务模型 | 根据用户任务自动调整界面 |
| 用户模型 | 记录用户偏好,个性化展示 | |
| 系统模型 | 预测用户行为,主动提供帮助 | |
| 设计时战术 | 用户接口分离 | MVC 中视图与模型分离 |
| 支持用户主动 | 取消、撤销、聚合、多个视图、历史、保存 | 用户体验操作 |
C.4 质量属性考点评分速查
| 属性 | 答题套路 | 关键词 |
|---|---|---|
| 高可用 | 负载均衡 + 冗余(主备) + 故障转移 + 降级 + 重试 | 心跳、Ping/Echo、热备、降级 |
| 高性能 | 缓存 + 并发 + 异步 + 负载均衡 + 限流 | 缓存、并发、异步、索引、分片 |
| 高可修改 | 分层/模块化 + 接口隔离 + 配置化 + 信息隐藏 | 接口分离、信息隐藏、插件化 |
WARNING
本表是案例问答题的万能公式。看到 “如何保证可用性/性能/可修改性” 等问法时,直接从上面抄战术。
D. 架构评估方法(论文高频 + 案例选考)
D.1 四种评估方法对比
| 方法 | 全称 | 关注焦点 | 阶段数 | 核心产出 | 考试重点 |
|---|---|---|---|---|---|
| ATAM | 架构权衡分析法 | 多属性权衡 | 9 步(+步骤 0) | 敏感点/权衡点/风险点/非风险点 | ★★★ 最常考 |
| SAAM | 软件架构分析法 | 可修改性 | 5~6 步 | 直接/间接场景、场景交互 | ★★ 次考 |
| ARID | 主动中间件设计评审 | 构件/中间件可复用性 | — | 构件复用适配度 | ★ 了解 |
| CBAM | 成本收益分析法 | 成本-收益权衡 | — | 风险-收益量化 | ★ 了解 |
NOTE
- ATAM:顾此失彼的问题(多个质量属性之间的 tradeoff)
- SAAM:只关心”好不好改”(可修改性),不涉及多属性权衡
- CBAM:加上”钱”的维度,评估哪个方案的性价比最高
D.2 ATAM 9 步流程
IMPORTANT
ATAM 两阶段结构:
- 第一阶段(展示与调查,步骤 1~6):展示方法、商业动机、架构、识别方法、生成效用树、分析方法
- 第二阶段(头脑风暴与再分析,步骤 7~9):场景头脑风暴、再次分析、结果呈现
ATAM 关键产出定义
| 产出 | 定义 | 示例 |
|---|---|---|
| 敏感点 (Sensitivity Point) | 一个或多个构件特性对质量属性产生显著影响 | ”使用缓存构件” 对性能有显著影响 |
| 权衡点 (Tradeoff Point) | 满足一个质量属性的同时损害另一个质量属性 | ”引入缓存提升性能,但降低了可修改性” |
| 风险点 (Risk Point) | 架构中可能引发问题的设计决策 | ”单点数据库可能引发可用性风险” |
| 非风险点 (Non-Risk Point) | 经评估确认不会引发问题的设计决策 | ”已部署主从数据库,可用性风险已缓解” |
WARNING
敏感点 ≠ 权衡点:敏感点只涉及”一动全身”(影响大);权衡点涉及”顾此失彼”(此消彼长)。所有权衡点都是敏感点,但并非所有敏感点都是权衡点。
D.3 SAAM 6 步流程
IMPORTANT
SAAM 核心考点:
- 直接场景 vs 间接场景:直接场景 = 现有架构直接支持,不需要修改;间接场景 = 需要修改架构才能支持
- 场景交互评估:如果多个间接场景都需要修改同一个构件 → 耦合度高 → 设计越差
- SAAM 只评估单一可修改性,不涉及多属性权衡
E. 架构其他核心
E.1 中间件分类与典型产品
| 类型 | 功能 | 典型产品 | 考试要点 |
|---|---|---|---|
| 数据库中间件 | 数据库连接池、SQL 路由、读写分离 | MyCAT、ShardingSphere、TDDL | 分库分表、读写分离 |
| 消息中间件 | 异步消息传递、削峰填谷 | Kafka、RabbitMQ、RocketMQ、ActiveMQ | 削峰/解耦/异步 |
| RPC 中间件 | 远程过程调用 | gRPC、Dubbo、Thrift | 服务间通信 |
| 事务中间件 | 分布式事务管理 | Seata、TCC、XA | 2PC/3PC/TCC |
| 门户中间件 | 单点登录、统一门户 | CAS、Portal | 企业应用集成 |
E.2 构件标准对比
| 标准 | 技术栈 | 特点 | 现状 |
|---|---|---|---|
| CORBA | 公共对象请求代理结构 | 跨语言、跨平台,但复杂度高 | 基本淘汰 |
| EJB | Enterprise JavaBeans | Java EE 标准,重量级 | 基本淘汰(被 Spring 取代) |
| COM+ | 微软组件对象模型 | Windows 平台 | 基本淘汰 |
TIP
构件标准在教材中有,但考试近年极少涉及(指南性了解即可)。重点放在微服务/云原生等现代架构风格上。
F. 记忆口诀与易错点
架构风格速记
| 风格 | 口诀 | 关键区分 |
|---|---|---|
| 管道-过滤器 | ”数据流水过管道” | 增量流式 ≠ 批量 |
| 事件驱动 | ”谁订阅谁响应” | 隐式调用,松耦合 |
| 黑板系统 | ”三要素:黑板知识源控制器” | 适合不确定性问题 |
| 层次结构 | ”只能向下调用” | 跨层调用破坏分层 |
| 虚拟机 | ”解释逐条走” | 灵活但性能低 |
质量属性战术速记
| 属性 | 速记口诀 |
|---|---|
| 可用性 | ”检测(Ping/心跳/异常),恢复(冗余/回滚/降级),预防(事务/监视器)“ |
| 可修改性 | ”局部改、防连锁、推迟绑” |
| 性能 | ”提效率、减开销、管速率;引并发、多副本、加资源” |
| 安全性 | ”抵抗(认证/授权/加密),检测(入侵/异常),恢复(审计)“ |
ATAM 与 SAAM 速记
| 维度 | ATAM | SAAM |
|---|---|---|
| 全称 | 架构权衡分析法 | 软件架构分析法 |
| 关注点 | 多属性权衡 | 单一可修改性 |
| 步骤 | 9 步(两阶段) | 6 步 |
| 关键产出 | 敏感点/权衡点/风险点 | 直接/间接场景、场景交互 |
| 核心图 | 效用树 | 场景分类表 |
WARNING
易错点汇总:
- 管道-过滤器 ≠ 批处理:前者增量流式,后者全量批量
- 黑板三要素:知识源 + 黑板(共享数据区) + 控制器,缺一不可
- 敏感点 ≠ 权衡点:敏感点只涉及”影响大”,权衡点涉及”此消彼长”
- ATAM 是两阶段:第一阶段(步骤 1
6)展示与调查;第二阶段(步骤 79)头脑风暴与再分析 - SAAM 只评估可修改性,不涉及性能/安全等其他属性
- 效用树标注:每个场景标
(重要性, 实现难度),不是(实现难度, 重要性)
G. 交叉引用与关联阅读
| 相关主题 | 位置 | 关联内容 |
|---|---|---|
| 计算机基础 | 01-cs-fundamentals.mdx | 可靠性计算、PV 操作、范式、事务 |
| 软件工程与 UML | 02-software-engineering-uml.mdx | 开发模型、UML 九图、类间关系 |
| 设计模式 | 04-design-patterns.mdx(待产) | 23 GoF 速查、架构中的应用 |
| 新技术 | 05-new-tech-web-arch.mdx(待产) | 微服务、云原生、容器、DevOps |
| 案例分析模板 | 06-case-analysis-template.mdx(待产) | 第 1 题答题套路、架构风格判断 |
| 论文素材库 | 07-essay-material-library.mdx(待产) | 架构评估论文写法、质量属性论述 |
H. 自测题(检验掌握程度)
-
某系统采用”传感器采集数据 → 数据清洗 → 特征提取 → 模型推理”的架构,数据像流水线一样逐条处理。请判断其架构风格。
点击查看答案
管道-过滤器 (Pipe-Filter)。核心特征:数据增量式流式处理,前置输出直接作为后置输入。 -
黑板系统的三要素是什么?
点击查看答案
①知识源(Knowledge Source);②黑板(Blackboard,共享数据区);③控制器(Controller,协调知识源)。 -
ATAM 和 SAAM 的核心区别是什么?
点击查看答案
ATAM 关注多属性权衡(可用性/性能/安全性等的 tradeoff),产出敏感点/权衡点/风险点;SAAM 只关注单一可修改性,产出直接/间接场景和场景交互评估。 -
在 ATAM 中,“引入缓存提升系统响应速度,但增加了系统的复杂度”属于哪种关键产出?
点击查看答案
权衡点 (Tradeoff Point)。因为提升性能的同时损害了可修改性,属于多质量属性之间的权衡。 -
请默写六类质量属性中,可用性和性能各自至少 3 个战术。
点击查看答案
可用性:Ping/Echo(错误检测)、主动冗余/热备(错误恢复)、降级(错误恢复)、事务(错误预防)。
性能:引入并发(资源管理)、维持数据多副本(资源管理)、提高计算效率(资源需求)、FIFO/优先级调度(资源仲裁)。
IMPORTANT
如果只能”看着面熟”但说不出来,说明还没真正掌握,建议回看对应章节并多做真题。本表要求做到核心架构风格对比表、质量属性战术表、ATAM/SAAM 流程图可默写。
下一篇导引:设计模式速查表(待产) 将涵盖 23 种 GoF 设计模式——创建型、结构型、行为型的速查与高频模式辨析。