目录
一、引言:什么是软件质量属性
软件质量属性(Software Quality Attribute)是衡量软件系统在其生命周期中是否"好用"的非功能性度量维度。功能正确只代表系统能"做正确的事",而质量属性决定了系统"把事情做得多好"——它跑得快不快、宕机少不少、改起来痛不痛、被攻击时不破不破。在系统架构设计师(软考)体系中,质量属性是架构评估、架构设计、需求分析三大主线交汇的核心知识。
软件质量属性是指反映软件产品某一规定特性的性质,是软件产品满足规定或隐含需求的能力的度量。质量属性是非功能性需求的载体,决定了软件在功能正确之外的"好坏"程度。架构设计的核心目标之一,就是通过特定的架构策略(战术与模式)来满足质量属性需求。
1.1 为什么质量属性如此重要
很多工程师做过这样的项目:功能跑通了,单元测试也过了,上线之后才发现——高峰期响应慢到客户骂街、一次发布要停机两小时、加一个小功能牵动半个系统。这些痛点本质上都不是"功能"问题,而是质量属性没有在架构层面被显式地设计。质量属性之所以关键,原因有三:
- 功能易扩展,质量难弥补:功能可以用"加代码"的方式补足,而性能、可用性这类属性一旦被架构定型,后期改动成本极高,往往需要推倒重来。质量属性是"架构的基因"。
- 质量属性之间相互冲突:安全性高了性能就低、可用性高了成本就高、可修改性强了运行效率往往下降。架构师的本职就是在冲突中做权衡,而权衡的前提是先识别和量化这些属性。
- 质量属性决定架构形态:同样是电商系统,强调性能会用缓存+读写分离+消息队列;强调可用性会做多活+故障转移;强调可修改性会做微服务+插件化。质量属性驱动架构选型。
1.2 质量属性与架构的关系
架构设计绝不是"画几张框图"那么简单。Bass 等人在《软件架构实践》中提出了一个被广泛接受的论断:架构 = {构件, 关系, 属性},而质量属性正是决定构件关系和属性取舍的核心驱动力。任何一个架构决策(如要不要引入消息队列、要不要做读写分离、要不要拆微服务),其背后都对应着一组质量属性诉求。
1. 业务场景产生质量属性需求(如秒杀场景要求高并发)
2. 质量属性需求驱动架构师选择战术(如缓存、异步、限流)
3. 一组相关的战术组合形成架构模式(如读写分离+分库分表)
4. 架构模式落地为具体的构件与连接件(如 Redis、Kafka、分片中间件)
5. 部署运行后通过度量验证质量属性是否满足(如 QPS、P99 延迟)
因此,软考中"质量属性 → 战术 → 模式"的因果链是必须吃透的考点。理解了这条链,才能在论述题中给出有理有据的架构方案,而不是堆砌名词。
二、质量属性分类总览
软考系统架构设计师中常考的质量属性主要围绕"运行质量"与"演化质量"两大维度展开。运行质量关注系统运行时的表现(性能、可用性、可靠性、安全性、易用性),演化质量关注系统在生命周期中的演化能力(可修改性、可测试性、可移植性、互操作性、可维护性)。下面这张总览图是必须烂熟于心的"骨架"。
软考中需要重点掌握的核心质量属性有六个:性能、可用性、可靠性、安全性、可修改性、可测试性。除此之外,功能性、可变性、互操作性也常作为次要考点出现。下面逐一深入剖析。
| 质量属性 | 所属类别 | 核心关注点 | 典型度量指标 |
|---|---|---|---|
| 性能 Performance | 运行质量 | 处理速度与效率 | 响应时间、吞吐量、并发数 |
| 可用性 Availability | 运行质量 | 系统持续可用 | MTBF、MTTR、可用度 |
| 可靠性 Reliability | 运行质量 | 无故障运行 | MTBF、故障率、失效率 |
| 安全性 Security | 运行质量 | 抵御攻击保护数据 | 机密性、完整性、可用性 |
| 可修改性 Modifiability | 演化质量 | 易于变更扩展 | 修改时间、修改成本、影响范围 |
| 可测试性 Testability | 演化质量 | 易于发现缺陷 | 测试覆盖率、缺陷检出率 |
| 功能性 Functionality | — | 提供所需功能 | 需求覆盖率、正确性 |
| 互操作性 Interoperability | 演化质量 | 与外部系统协作 | 接口兼容性、集成成本 |
三、性能(Performance)
性能是软件质量属性中最直观、最常被业务关注的一个。它衡量系统在时间和资源两个维度上处理请求的能力。性能差的系统功能再丰富也无人使用,因此它是绝大多数架构设计的第一道门槛。
3.1 定义与度量指标
性能(Performance)指系统处理请求、完成任务的效率,主要体现在响应时间和吞吐量两方面。性能反映了系统在单位时间内能处理的工作量,以及单个请求从发起到完成的延迟。
性能的度量指标主要有以下几个,必须熟记它们之间的关系:
- 响应时间(Response Time):从客户端发起请求到收到响应所经历的时间,包括网络传输、队列等待、服务处理、数据库访问等全部时间。常用 P50、P95、P99 等分位值度量。
- 吞吐量(Throughput):单位时间内系统处理的请求数量,常用 QPS(每秒查询数)或 TPS(每秒事务数)表示。
- 并发数(Concurrency):系统同时处理的请求数量。并发数 = 吞吐量 × 平均响应时间(Little's Law,利特尔法则)。
- 资源利用率:CPU、内存、网络带宽、磁盘 I/O 的占用率。在系统未饱和前,吞吐量随并发数线性上升;资源饱和后,吞吐量持平而响应时间急剧上升。
3.2 性能战术
性能战术的目标是减少请求处理时间或提升单位时间处理能力。Bass 将性能战术分为三大类:资源需求控制、资源管理、资源仲裁。下面这张战术树是软考的高频考点。
| 战术分类 | 具体战术 | 典型实现 | 适用场景 |
|---|---|---|---|
| 资源需求控制 | 缓存 | Redis、本地缓存、CDN | 读多写少、热点数据 |
| 减少计算开销 | 增量计算、预计算、索引 | 报表聚合、搜索 | |
| 限制采样率 | 限频采样、批处理 | 监控上报、IoT 数据 | |
| 资源管理 | 引入并发 | 多线程、协程、异步 IO | CPU/IO 混合型任务 |
| 维持副本 | 主从复制、多副本 | 读扩展、数据容灾 | |
| 增加资源 | 横向扩展、垂直升级 | 业务量增长 | |
| 资源调度 | 连接池、线程池、协程池 | 高频短任务 | |
| 资源仲裁 | 调度策略 | FIFO、优先级、公平队列 | 多任务竞争资源 |
| 动态优先级 | 老化算法、反馈调度 | 避免低优先级饥饿 | |
| 限流降级 | 令牌桶、漏桶、熔断 | 突发流量、雪崩防护 |
核心战术速记
- 缓存:降低资源需求的最有效手段,命中率是关键指标
- 并发/并行:多线程、协程、消息队列异步化
- 资源调度:连接池、线程池避免频繁创建销毁
- 数据分区:分库分表、分片,把单点瓶颈分散
3.3 案例:电商秒杀系统性能优化
背景:某电商秒杀活动瞬时涌入百万级用户,原系统在 1000 QPS 即出现响应时间超过 5 秒、数据库连接耗尽、库存超卖三大问题。架构师通过对症施治完成了性能改造。
优化方案采用了性能战术的组合拳:
- 缓存层(CDN + Redis):静态资源走 CDN,商品详情走 Redis 缓存,库存数字预扣减在 Redis 中以 Lua 原子操作完成,避免击穿数据库。
- 限流降级(网关层):在网关采用令牌桶算法限制单 IP 请求频率,超出阈值的请求直接返回"排队中",保护后端服务。
- 异步化(消息队列):用户下单后不直接落库,而是发送到 Kafka 队列,订单服务按数据库能力消费,削峰填谷。
- 水平扩展:订单服务无状态化,按 CPU 利用率自动弹性扩容到多实例。
- 分库分表:订单表按用户 ID 哈希分到 64 个分片,避免单库写入瓶颈。
战术收益
- 吞吐量提升 50 倍,达 50000 QPS
- P99 响应时间从 5 秒降至 200 毫秒
- 库存零超卖,数据一致
- 系统可在突发流量下保持稳定
代价与风险
- 架构复杂度大幅上升,运维成本高
- 缓存与数据库一致性需额外机制保证
- 异步引入最终一致,用户体验需引导
- 限流可能误杀正常用户
四、可用性(Availability)
可用性衡量系统"在该用的时候能用"的能力。一台永远不宕机但每秒只能处理一个请求的服务器可用性是 100%,但显然不实用——因此可用性必须与性能共同考虑。可用性是金融、医疗、电信等关键行业最看重的质量属性。
4.1 定义与核心公式
可用性(Availability)指系统在某一时刻能够正确提供服务的概率或时间比例。它是衡量系统"持续可用"程度的关键指标,反映了系统对外正常服务的总时间占比。
衡量可用性有三个核心指标,软考中必须掌握其公式和相互关系:
- MTTF(Mean Time To Failure,平均无故障时间):系统两次故障之间的平均正常运行时间,反映系统"不容易坏"。
- MTTR(Mean Time To Repair,平均修复时间):从故障发生到系统恢复正常的平均时间,反映系统"修得快"。
- MTBF(Mean Time Between Failure,平均故障间隔时间):MTBF = MTTF + MTTR,即两次故障之间的总时间。
可用度 A = MTTF / (MTTF + MTTR) = MTTF / MTBF
提升可用性的两条路径:增大 MTTF(让系统更不容易坏)和减小 MTTR(让系统恢复更快)。这两条路径对应不同的可用性战术。
4.2 可用性等级表
业界常用"几个 9"来描述可用性等级。每多一个 9,意味着系统不可用时间大幅缩短,但代价呈指数级上升。
| 可用性等级 | 可用度 | 年宕机时间 | 典型应用 | 实现难度 |
|---|---|---|---|---|
| 2 个 9 | 99% | 3.65 天 | 个人博客、内部工具 | 单机部署即可 |
| 3 个 9 | 99.9% | 8.76 小时 | 普通企业系统 | 主备+监控 |
| 4 个 9 | 99.99% | 52.6 分钟 | 金融核心、电商 | 双活+故障转移 |
| 5 个 9 | 99.999% | 5.26 分钟 | 电信核心网、急救系统 | 多活+冗余全套 |
| 6 个 9 | 99.9999% | 31.5 秒 | 航天、核电站控制 | 极端容错设计 |
· 99.9% → 0.1% × 525600 = 525.6 分钟 ≈ 8.76 小时
· 99.99% → 0.01% × 525600 = 52.56 分钟
· 99.999% → 0.001% × 525600 = 5.26 分钟
4.3 可用性战术
可用性战术的目标是减少故障导致的不可用时间,本质是降低 MTTR、提升 MTTF。Bass 把可用性战术分为三大类:错误检测、错误恢复、错误预防。
| 战术分类 | 战术 | 说明 |
|---|---|---|
| 错误检测 | 命令/响应 | 主动 ping 远程服务确认存活 |
| 心跳 | 周期性发送心跳包,超时判定故障 | |
| 异常检测 | 监控指标偏离正常范围即告警 | |
| 超时 | 请求超阈值未响应即判定失败 | |
| 错误恢复 | 表决 | 多副本投票,少数服从多数(Paxos/Raft) |
| 主动冗余 | 热备:所有副本同时处理,故障时无感切换 | |
| 被动冗余 | 温备/冷备:主备切换有短暂中断 | |
| 备件 | 预留备用构件,故障时替换 | |
| 状态再同步 | 故障恢复后从健康副本同步状态 | |
| 错误预防 | 服务删除 | 将故障实例从服务列表中摘除 |
| 事务回滚 | 事务失败时撤销已执行的变更 | |
| 进程监控 | 守护进程重启异常退出的服务 | |
| 优雅降级 | 核心功能保留,非核心功能关闭 |
4.4 案例:微服务高可用方案
背景:某支付服务采用微服务架构,单实例部署时每年因发布、故障导致宕机约 4 小时,可用性仅 99.95%。业务方要求达到 99.99%。
方案采用可用性战术的组合:
- 错误检测:在服务网格中引入心跳探针,每 5 秒检查一次健康端点;接入全链路监控,对异常指标(错误率突增、延迟抖动)实时告警。
- 错误恢复:服务多实例部署(不少于 3 个),通过 Kubernetes 自动摘除不健康实例;数据库采用主从 + 自动故障切换,主库故障 30 秒内切换到从库。
- 错误预防:采用蓝绿发布与灰度发布,避免一次性全量发布;引入熔断器(如 Hystrix/Sentinel),下游故障时快速失败避免雪崩;非核心功能(如积分发放)支持优雅降级。
五、可靠性(Reliability)
可靠性与可用性常被混为一谈,但二者关注点不同。可用性关心"系统是否可用",可靠性关心"系统是否正确运行"。一台能正常开机但经常算错账的服务器可用性高但可靠性低。
5.1 定义与可用性的区别
可靠性(Reliability)指系统在规定条件下、规定时间内完成规定功能的能力,衡量的是"软件在一段时间内不出现故障的概率"。它关注的是系统输出结果的正确性和稳定性,而不仅仅是"在线"。
| 对比维度 | 可用性 Availability | 可靠性 Reliability |
|---|---|---|
| 关注点 | 系统能否被使用 | 系统能否正确运行 |
| 度量指标 | 可用度(时间比例) | MTBF、失效率、故障率 |
| 时间维度 | 瞬时可用概率 | 一段时间内无故障概率 |
| 典型问题 | 宕机、不可访问 | 结果错误、数据错乱 |
| 提升手段 | 故障转移、冗余 | 错误检测、错误恢复、错误预防 |
5.2 可靠性战术
可靠性战术与可用性战术结构相似,但更侧重于错误的检测、恢复与预防,以保证系统输出正确。
5.3 案例:航空系统容错设计
背景:飞控系统对可靠性要求极高,单次计算错误可能导致灾难性后果。该系统采用三机冗余+表决架构。
设计要点:三台计算机硬件异构(不同 CPU、不同操作系统、不同团队实现)以避免共因失效;表决器采用 2/3 多数派策略——任意一台出错不影响输出正确性;每个计算单元均做 CRC 校验与看门狗监控。该方案使系统失效率低于 10⁻⁹/小时。
优势
- 单点错误可被多数派纠正
- 硬件异构防止共因失效
- 看门狗保证检测覆盖
代价
- 三倍硬件成本
- 表决引入额外延迟
- 实现复杂度极高
六、安全性(Security)
安全性是衡量系统抵御非授权访问、保护数据和功能不被破坏的能力。在数据资产化、合规化(GDPR、个保法)的今天,安全性已经成为架构设计的"底线"。
6.1 定义:CIA 三元组
安全性(Security)指系统在向合法用户提供服务的同时,阻止非授权访问、使用、修改、破坏的能力。安全性的核心是 CIA 三元组:
· 机密性(Confidentiality):信息不泄露给非授权方
· 完整性(Integrity):信息不被非授权修改,保持准确完整
· 可用性(Availability):合法用户能正常访问(注意:此处"可用性"是安全视角的,与第四节的运行可用性侧重不同)
6.2 安全性战术
安全性战术围绕"抵抗攻击、检测攻击、从攻击中恢复"展开,本质是对抗非授权访问。
| 战术分类 | 战术 | 典型实现 |
|---|---|---|
| 抵抗攻击 | 认证 | 账号密码、双因子、生物识别 |
| 授权 | RBAC、ABAC、ACL | |
| 数据加密 | TLS、AES、对称/非对称加密 | |
| 限制访问 | 防火墙、IP 白名单、网段隔离 | |
| 数据有效性校验 | 输入校验、参数过滤、防 SQL 注入 | |
| 检测攻击 | 入侵检测 | IDS、异常行为分析 |
| 审计日志 | 操作日志、合规审计 | |
| 异常检测 | 行为基线、流量异常告警 | |
| 从攻击中恢复 | 数据备份 | 定期全量+增量备份 |
| 恢复 | 故障回滚、数据还原 |
6.3 案例:银行系统安全架构
背景:某银行核心系统需满足金融合规要求,防御内外部攻击,保护客户资金与隐私。
方案采用纵深防御:
- 边界层:互联网出口部署 WAF 拦截 SQL 注入与 XSS;DDoS 清洗中心抗流量攻击;DMZ 区与内网严格隔离,仅开放必要端口。
- 身份层:客户登录采用密码+短信验证码双因子认证;内部员工使用数字证书登录堡垒机,所有操作录屏审计。
- 授权层:基于 RBAC 划分柜员、主管、审计等角色,遵循最小权限原则;高风险操作(大额转账)需双人复核。
- 数据层:传输全程 TLS 加密;数据库中敏感字段(卡号、密码)AES 加密存储;关键表启用行级权限。
- 审计层:所有操作落审计日志,日志独立存储且不可篡改(区块链存证);部署 IDS 实时检测异常行为。
七、可修改性(Modifiability)
可修改性是衡量系统在生命周期中应对变更的能力。软件的"软"就在于可变,但变更的成本差异巨大——好的架构让"加功能"变得轻松,差的架构让"改一行代码"牵动全身。
7.1 定义与度量
可修改性(Modifiability)指系统在规定时间和成本内完成变更的难易程度。变更可能源于:新增功能、修改已有功能、删除功能、调整性能、适配新技术等。可修改性度量两个维度:修改成本(人力、时间、风险)和变更影响范围(涉及多少模块)。
衡量可修改性的常用指标包括:
- 修改时间:完成一次变更从开始到上线所需的工时
- 修改成本:人力投入与潜在风险成本
- 变更影响范围:需要修改的模块数、代码行数
- 变更引入缺陷率:每次变更平均引入的新缺陷数
7.2 可修改性战术
可修改性战术的核心思想是限制修改的影响范围,即"局部化变更"。Bass 把可修改性战术分为三大类:局部化修改、防止连锁反应、推迟绑定时间。
战术速记
- 模块化:把相关功能聚成模块,模块间低耦合
- 信息隐藏:接口对外,实现隐藏,内部变更不影响外部
- 延迟绑定:把决策推迟到运行时(配置、插件、多态)
7.3 案例:插件化架构设计
背景:某 SaaS 平台需要支持多家客户的差异化业务规则,频繁为不同客户定制开发,原架构每加一个客户规则就要改主流程代码,回归测试成本巨大。
方案:采用插件化架构。核心流程抽象为稳定接口(订单处理、计费、风控),具体规则以插件形式实现,通过配置文件指定生效插件。运行时由插件管理器动态加载、注册、调用插件,不同客户启用不同插件组合。
优势
- 新增规则不动核心代码
- 回归测试范围大幅缩小
- 支持灰度、A/B 测试
- 客户定制独立互不影响
代价
- 前期抽象成本高
- 插件管理增加运行开销
- 插件版本兼容性需管理
八、可测试性(Testability)
可测试性衡量系统被测试的难易程度。一个难以测试的系统往往缺陷率高、维护成本大,因为缺陷难以及时发现。可测试性是 CI/CD 与敏捷开发的基础。
8.1 定义与度量
可测试性(Testability)指通过测试发现软件缺陷的容易程度。可测试性高的系统,测试用例易于编写、执行和控制,缺陷易于暴露和定位。度量指标包括:测试覆盖率(语句、分支、路径覆盖)、缺陷检出率、测试执行时间、测试用例编写成本。
8.2 可测试性战术
可测试性战术的核心思想是让软件内部状态可观察、可控制。Bass 将其分为两类:控制和观察。
| 战术分类 | 战术 | 说明 |
|---|---|---|
| 控制输入/输出 | 测试接口 | 提供专门测试用的接口与钩子 |
| 记录/回放 | 记录线上请求并回放用于测试 | |
| 模拟/打桩 | 用 Mock 替换外部依赖 | |
| 内部监视 | 内置监控 | 暴露内部状态、指标、日志 |
| 可观察性 | 分布式追踪、日志聚合 | |
| 测试钩子 | 专门为测试预留的入口 |
8.3 案例:自动化测试体系
背景:某团队每周发布一次,每次发布前手工回归测试需 3 天,且经常遗漏缺陷导致线上事故。
方案:建立分层自动化测试体系。单元测试覆盖率要求 80%,集成测试覆盖核心接口,关键路径有端到端测试;引入 Mock 解决外部依赖问题;CI 流水线在每次提交自动运行单元测试,每次合并自动运行集成测试,每天定时运行端到端测试;为内部状态暴露监控接口便于诊断。
战术应用:测试接口 + Mock 打桩 + 监控接口(可观察性)+ 测试钩子。
九、质量属性场景
质量属性本身是抽象的,要让它"可设计、可评估",必须用质量属性场景将其具体化。这是软考中 ATAM(架构权衡分析法)等评估方法的基础。
9.1 场景的六大要素
1. 刺激源(Source):产生刺激的实体(用户、外部系统、内部构件)
2. 刺激(Stimulus):到达系统的事件(请求、故障、攻击、变更需求)
3. 制品(Artifact):被刺激影响的部分(整个系统、特定模块、特定数据)
4. 环境(Environment):刺激发生时的系统状态(正常运行、过载、降级、离线)
5. 响应(Response):系统对刺激的处理行为(处理请求、记录日志、拒绝访问、回滚)
6. 响应度量(Response Measure):响应的可量化指标(响应时间、可用度、是否拦截)
理解场景六要素的关键在于"响应度量"——它是质量属性的量化锚点。没有度量的场景只是模糊需求,例如"系统要快"无法评估,而"用户在高峰期发起查询请求,系统在 200ms 内返回结果"才是可设计、可测试的场景。
9.2 各质量属性的场景示例
下面给出六大质量属性的典型场景示例,帮助理解如何用六要素描述质量需求。
| 质量属性 | 刺激源 | 刺激 | 环境 | 响应 | 响应度量 |
|---|---|---|---|---|---|
| 性能 | 用户 | 发起查询请求 | 高峰期正常 | 处理请求返回结果 | 平均响应≤200ms,P99≤500ms |
| 可用性 | 内部硬件 | 服务器宕机 | 正常运行 | 故障转移至备机 | 切换时间≤30s,可用度≥99.99% |
| 可靠性 | 网络 | 消息重复/丢失 | 网络抖动 | 检测并去重/重传 | 消息正确率≥99.999% |
| 安全性 | 攻击者 | 尝试 SQL 注入 | 互联网暴露 | 拦截并记录告警 | 拦截率100%,0 越权 |
| 可修改性 | 开发人员 | 新增支付渠道 | 开发期 | 实现并上线新渠道 | 修改≤3人日,不动核心 |
| 可测试性 | 测试人员 | 提交回归测试 | CI 流水线 | 自动运行测试 | 覆盖率≥80%,10分钟内完成 |
9.3 场景的优先级排序
一个系统可能有数十上百个质量属性场景,全部满足往往不现实。ATAM 等方法要求对场景做优先级排序,常用方法包括:
- 投票法:让利益相关方对场景投票,得票高者优先
- 影响分析:评估场景不满足时的业务损失,损失大者优先
- 难度评估:结合实现成本,优先满足"高价值低成本"的场景
十、质量属性战术总结
战术(Tactics)是质量属性设计的"原子单元"——比架构模式更细粒度。一个架构模式通常是多个战术的组合。掌握战术分类是软考的核心考点。
10.1 全量战术汇总表
| 质量属性 | 战术大类 | 具体战术 |
|---|---|---|
| 性能 | 资源需求 | 缓存、减少计算、限制采样率 |
| 资源管理 | 并发、副本、增加资源、调度 | |
| 资源仲裁 | 调度策略、动态优先级、限流降级 | |
| 可用性 | 错误检测 | 命令/响应、心跳、异常、超时 |
| 错误恢复 | 表决、主动/被动冗余、备件、再同步 | |
| 错误预防 | 服务删除、事务回滚、进程监控、降级 | |
| 可靠性 | 错误检测 | 命令/响应、心跳、异常、校验和、看门狗 |
| 错误恢复 | 表决、冗余、再同步、回滚/重做 | |
| 错误预防 | 服务删除、事务、进程监视、退出/拒绝 | |
| 安全性 | 抵抗攻击 | 认证、授权、加密、限制访问、有效性校验 |
| 检测攻击 | 入侵检测、审计日志、异常检测 | |
| 恢复 | 备份、恢复、回滚 | |
| 可修改性 | 局部化修改 | 模块化、信息隐藏、维持接口、限制通信 |
| 防止连锁反应 | 信息隐藏、中间层、限制依赖、重用 | |
| 推迟绑定 | 配置、运行时注册、多态、插件 | |
| 可测试性 | 控制输入/输出 | 测试接口、记录/回放、模拟/打桩 |
| 内部监视 | 内置监控、可观察性、测试钩子 |
10.2 战术分类总览图
战术是设计决策的"原子",粒度小、单一职责;架构模式是战术的组合,粒度大、解决一类问题。例如"主备冗余"模式 = 心跳检测 + 主动冗余 + 故障转移 + 状态再同步 四个战术的组合。考试中常考"某架构应用了哪些战术",需从模式反推战术。
十一、质量属性权衡
质量属性之间并非独立,它们相互影响、彼此制约。架构师的核心工作不是"全都要",而是在冲突中做权衡(Trade-off)。理解权衡是软考论述题拿高分的关键。
11.1 典型冲突对
| 冲突对 | 冲突原因 | 典型权衡策略 |
|---|---|---|
| 性能 vs 安全性 | 加密、校验、审计都增加开销 | 核心数据强加密,非核心明文;异步审计 |
| 可用性 vs 成本 | 多副本、多活成本高 | 分级可用性,核心多活非核心单点 |
| 可修改性 vs 性能 | 抽象层、间接调用降低运行效率 | 热点路径直连,非热点分层 |
| 安全性 vs 易用性 | 多因子认证、复杂密码降低体验 | 风险分级,低风险操作简化认证 |
| 可测试性 vs 性能 | 测试钩子、监控埋点增加开销 | 测试接口可开关,生产环境关闭 |
| 可靠性 vs 成本 | 三机冗余、CRC 校验成本高 | 关键路径冗余,非关键路径单点 |
11.2 权衡矩阵
11.3 案例:权衡分析实例
背景:某在线医疗系统需同时满足:高峰期响应≤500ms(性能)、年宕机≤52分钟(可用性)、患者数据加密存储(安全性)、支持快速接入新医院(可修改性)。这四项需求存在明显冲突。
· 性能 vs 安全性:全链路加密会使响应增加 50~100ms
· 可用性 vs 可修改性:多副本部署让"改一处"变成"改多处"
· 性能 vs 可修改性:分层抽象引入额外调用开销
权衡方案采用分级策略:
- 分级安全:核心数据(病历、处方)强加密存储+传输加密;非核心数据(公告、科普)明文,降低性能损耗。
- 分级可用:核心服务(挂号、问诊)三副本多活;非核心服务(资讯、统计)单点+定时备份,降低修改成本。
- 分级性能:热点路径(挂号查询)直连缓存,绕过抽象层;非热点路径分层设计保证可修改性。
- 分级修改:医院接入走插件化接口(延迟绑定),核心诊疗流程保持稳定。
十二、软考真题解析与考点总结
12.1 常见题型
软考系统架构设计师中,质量属性相关考点主要出现在综合知识(选择题)、案例分析(简答+设计)和论文三大模块。
| 题型 | 考查方式 | 高频考点 |
|---|---|---|
| 选择题 | 给战术归类、辨析概念 | 战术归属、六要素名称、可用度公式 |
| 案例题 | 给场景分析使用了哪些战术/质量属性 | 从架构反推战术、写质量属性场景 |
| 论文题 | 结合项目论述质量属性设计 | 权衡分析、战术应用、场景驱动设计 |
12.2 必背公式与数据
· 可用度 A = MTTF / (MTTF + MTTR) = MTTF / MTBF
· MTBF = MTTF + MTTR
· 并发数 = 吞吐量 × 平均响应时间(Little's Law)
· 可靠性 R(t) = e^(-λt),λ 为失效率
· 年宕机分钟 = (1 - A) × 525600
12.3 记忆口诀
六大属性速记口诀
- 性、用、靠、安、改、测——性能、可用性、可靠性、安全性、可修改性、可测试性
- 运行质量"快稳靠安":性能快、可用稳、可靠不宕、安全不破
- 演化质量"改测移协":可改、可测、可移、可互操作
战术分类速记
- 性能:需求(缓存)→ 管理(并发)→ 仲裁(限流)
- 可用/可靠:检测(心跳)→ 恢复(冗余)→ 预防(降级)
- 安全:抵抗(认证加密)→ 检测(审计)→ 恢复(备份)
- 可修改:局部化(模块)→ 防连锁(中间层)→ 推迟(配置)
- 可测试:控制IO(Mock)→ 监视(钩子)
场景六要素速记
"源、激、制、境、响、量"——刺激源、刺激、制品、环境、响应、响应度量。前五个是"发生了什么",最后一个是"做得怎么样"。
12.4 典型真题示例
某系统采用主备冗余、心跳检测、故障自动切换,这些战术主要提升的质量属性是?
A. 性能 B. 可用性 C. 可修改性 D. 可测试性
答案:B。主备冗余+心跳+故障转移是典型的可用性战术(错误检测+错误恢复)。
提高可用性的两条路径是增大 MTTF 和减小 MTTR,下列哪项主要减小 MTTR?
A. 冗余 B. 限流 C. 加密 D. 模块化
答案:A。冗余使故障后能快速切换恢复,缩短 MTTR;而提高 MTTF 多靠预防性战术。
请用质量属性场景描述"系统在遭受 DDoS 攻击时仍能对外提供服务"。
参考答案:刺激源=攻击者;刺激=DDoS攻击;制品=网关与核心服务;环境=正常运行;响应=流量清洗+限流+降级保核心;响应度量=核心接口可用度≥99.9%,P99≤1s。
12.5 论文写作要点
质量属性是论文题的高频主题。写作时建议遵循"场景→战术→模式→验证"四段式结构:
- 场景:用六要素描述项目中的质量需求,体现需求来源
- 战术:明确列出选用了哪些战术,归到哪一大类
- 模式:说明战术如何组合成架构模式,落地为哪些构件
- 验证:给出度量指标与实际效果数据,证明设计有效
1. 六大属性必背:性能、可用性、可靠性、安全性、可修改性、可测试性
2. 可用度公式必背:A = MTTF / (MTTF + MTTR)
3. 战术分类必背:每个属性的三类战术及代表战术
4. 场景六要素必背:源、激、制、境、响、量
5. 权衡思想必背:属性间冲突普遍存在,分级处理是常用手段
6. CIA三元组必背:机密性、完整性、可用性
7. 战术与模式关系:战术是原子,模式是组合
8. 答题要诀:六要素齐全、公式准确、战术归类正确、权衡有据
质量属性不是孤立的指标,而是贯穿架构设计全过程的决策指南。从需求阶段的场景刻画,到设计阶段的战术选择,再到评估阶段的度量验证,质量属性提供了一条从"业务价值"到"技术实现"的完整闭环。掌握它,就掌握了架构设计的"权衡之术"——这正是系统架构设计师区别于普通工程师的核心能力。