← 返回博客列表

一、引言:什么是软件质量属性

软件质量属性(Software Quality Attribute)是衡量软件系统在其生命周期中是否"好用"的非功能性度量维度。功能正确只代表系统能"做正确的事",而质量属性决定了系统"把事情做得多好"——它跑得快不快、宕机少不少、改起来痛不痛、被攻击时不破不破。在系统架构设计师(软考)体系中,质量属性是架构评估、架构设计、需求分析三大主线交汇的核心知识。

核心定义(软考标准表述)
软件质量属性是指反映软件产品某一规定特性的性质,是软件产品满足规定或隐含需求的能力的度量。质量属性是非功能性需求的载体,决定了软件在功能正确之外的"好坏"程度。架构设计的核心目标之一,就是通过特定的架构策略(战术与模式)来满足质量属性需求。

1.1 为什么质量属性如此重要

很多工程师做过这样的项目:功能跑通了,单元测试也过了,上线之后才发现——高峰期响应慢到客户骂街、一次发布要停机两小时、加一个小功能牵动半个系统。这些痛点本质上都不是"功能"问题,而是质量属性没有在架构层面被显式地设计。质量属性之所以关键,原因有三:

业务需求 功能性需求 "做什么" 质量属性 非功能性需求 "做得多好" 架构设计 战术 / 模式 "如何实现" 系统"做什么" 决定系统"好坏" 决定"如何做" 质量属性是连接需求与架构的桥梁
图 1:质量属性在需求与架构之间的桥梁作用

1.2 质量属性与架构的关系

架构设计绝不是"画几张框图"那么简单。Bass 等人在《软件架构实践》中提出了一个被广泛接受的论断:架构 = {构件, 关系, 属性},而质量属性正是决定构件关系和属性取舍的核心驱动力。任何一个架构决策(如要不要引入消息队列、要不要做读写分离、要不要拆微服务),其背后都对应着一组质量属性诉求。

架构与质量属性的因果链
1. 业务场景产生质量属性需求(如秒杀场景要求高并发)
2. 质量属性需求驱动架构师选择战术(如缓存、异步、限流)
3. 一组相关的战术组合形成架构模式(如读写分离+分库分表)
4. 架构模式落地为具体的构件与连接件(如 Redis、Kafka、分片中间件)
5. 部署运行后通过度量验证质量属性是否满足(如 QPS、P99 延迟)

因此,软考中"质量属性 → 战术 → 模式"的因果链是必须吃透的考点。理解了这条链,才能在论述题中给出有理有据的架构方案,而不是堆砌名词。

二、质量属性分类总览

软考系统架构设计师中常考的质量属性主要围绕"运行质量"与"演化质量"两大维度展开。运行质量关注系统运行时的表现(性能、可用性、可靠性、安全性、易用性),演化质量关注系统在生命周期中的演化能力(可修改性、可测试性、可移植性、互操作性、可维护性)。下面这张总览图是必须烂熟于心的"骨架"。

软件质量属性 运行质量属性 演化质量属性 性能 可用性 可靠性 安全性 易用性 可修改 可测试 可移植 互操作 功能性 运行质量度量 响应时间 / 吞吐量 / MTBF MTTR / 故障率 / 攻击拦截率 → 系统运行时可直接观测 演化质量度量 修改耗时 / 修改成本 / 测试覆盖率 缺陷密度 / 集成成本 / 适配工作量 → 系统演化过程中度量 软考六大核心质量属性(必考) 性能 · 可用性 · 可靠性 · 安全性 · 可修改性 · 可测试性 次要考点:功能性 · 可变性 · 互操作性 · 易用性 考点:每个属性的战术分类、度量指标、典型场景
图 2:软件质量属性分类总览(运行质量 vs 演化质量)

软考中需要重点掌握的核心质量属性有六个:性能、可用性、可靠性、安全性、可修改性、可测试性。除此之外,功能性、可变性、互操作性也常作为次要考点出现。下面逐一深入剖析。

质量属性 所属类别 核心关注点 典型度量指标
性能 Performance运行质量处理速度与效率响应时间、吞吐量、并发数
可用性 Availability运行质量系统持续可用MTBF、MTTR、可用度
可靠性 Reliability运行质量无故障运行MTBF、故障率、失效率
安全性 Security运行质量抵御攻击保护数据机密性、完整性、可用性
可修改性 Modifiability演化质量易于变更扩展修改时间、修改成本、影响范围
可测试性 Testability演化质量易于发现缺陷测试覆盖率、缺陷检出率
功能性 Functionality—提供所需功能需求覆盖率、正确性
互操作性 Interoperability演化质量与外部系统协作接口兼容性、集成成本
记忆口诀:运行质量看"快、稳、靠、安"——性能快、可用稳、可靠不宕、安全不破;演化质量看"改、测、移、协"——可改、可测、可移、可互操作。六大核心记:"性、用、靠、安、改、测"。

三、性能(Performance)

性能是软件质量属性中最直观、最常被业务关注的一个。它衡量系统在时间和资源两个维度上处理请求的能力。性能差的系统功能再丰富也无人使用,因此它是绝大多数架构设计的第一道门槛。

3.1 定义与度量指标

性能的正式定义
性能(Performance)指系统处理请求、完成任务的效率,主要体现在响应时间和吞吐量两方面。性能反映了系统在单位时间内能处理的工作量,以及单个请求从发起到完成的延迟。

性能的度量指标主要有以下几个,必须熟记它们之间的关系:

吞吐量 / 资源利用率 并发数(负载) 吞吐量 响应时间 资源利用率 最佳并发点 饱和区 响应时间暴涨 线性区 吞吐随并发上升
图 3:吞吐量、响应时间、资源利用率随并发数变化关系
常见误区:性能优化不是无脑加机器。系统在"最佳并发点"之前吞吐量随并发线性上升,过了拐点之后响应时间急剧恶化但吞吐量不再增长。此时加机器只能延缓问题,关键在于找到瓶颈点并消除它——可能是数据库锁、可能是 GC 抖动、可能是网络 I/O。

3.2 性能战术

性能战术的目标是减少请求处理时间或提升单位时间处理能力。Bass 将性能战术分为三大类:资源需求控制、资源管理、资源仲裁。下面这张战术树是软考的高频考点。

性能战术 资源需求控制 资源管理 资源仲裁 降低资源需求 · 计算结果缓存 · 减少计算开销 · 限制事件采样率 · 控制采样频率 → 减少不必要的计算 增加资源 / 调度 · 引入并发(多线程) · 维持数据/计算副本 · 增加资源(横向扩展) · 资源调度与队列管理 → 提高资源利用率 资源仲裁 · 调度策略(FIFO/优先级) · 公平调度 · 动态优先级 · 限流降级 → 冲突时合理分配 战术选择要点 先降低需求(缓存、采样控制)→ 再增加资源(并发、扩展)→ 最后仲裁调度 战术常组合使用:缓存 + 读写分离 + 限流 + 异步化 考点:每种子战术的归属、典型应用场景
图 4:性能战术分类树(资源需求控制 / 资源管理 / 资源仲裁)
战术分类具体战术典型实现适用场景
资源需求控制缓存Redis、本地缓存、CDN读多写少、热点数据
减少计算开销增量计算、预计算、索引报表聚合、搜索
限制采样率限频采样、批处理监控上报、IoT 数据
资源管理引入并发多线程、协程、异步 IOCPU/IO 混合型任务
维持副本主从复制、多副本读扩展、数据容灾
增加资源横向扩展、垂直升级业务量增长
资源调度连接池、线程池、协程池高频短任务
资源仲裁调度策略FIFO、优先级、公平队列多任务竞争资源
动态优先级老化算法、反馈调度避免低优先级饥饿
限流降级令牌桶、漏桶、熔断突发流量、雪崩防护

核心战术速记

  • 缓存:降低资源需求的最有效手段,命中率是关键指标
  • 并发/并行:多线程、协程、消息队列异步化
  • 资源调度:连接池、线程池避免频繁创建销毁
  • 数据分区:分库分表、分片,把单点瓶颈分散

3.3 案例:电商秒杀系统性能优化

背景:某电商秒杀活动瞬时涌入百万级用户,原系统在 1000 QPS 即出现响应时间超过 5 秒、数据库连接耗尽、库存超卖三大问题。架构师通过对症施治完成了性能改造。

用户 CDN 缓存 网关 令牌桶限流 熔断降级 Redis 缓存 库存预扣减 消息队列 异步削峰 解耦 订单服务 水平扩展 多实例 数据库 分库分表 读写分离 优化前后对比 优化前:1000 QPS / 响应 5s / 库存超卖 → 优化后:50000 QPS / 响应 200ms / 零超卖 应用战术:缓存 + 限流降级 + 异步化 + 水平扩展 + 分库分表
图 5:电商秒杀系统性能优化架构(多战术组合应用)

优化方案采用了性能战术的组合拳:

  1. 缓存层(CDN + Redis):静态资源走 CDN,商品详情走 Redis 缓存,库存数字预扣减在 Redis 中以 Lua 原子操作完成,避免击穿数据库。
  2. 限流降级(网关层):在网关采用令牌桶算法限制单 IP 请求频率,超出阈值的请求直接返回"排队中",保护后端服务。
  3. 异步化(消息队列):用户下单后不直接落库,而是发送到 Kafka 队列,订单服务按数据库能力消费,削峰填谷。
  4. 水平扩展:订单服务无状态化,按 CPU 利用率自动弹性扩容到多实例。
  5. 分库分表:订单表按用户 ID 哈希分到 64 个分片,避免单库写入瓶颈。
战术收益
  • 吞吐量提升 50 倍,达 50000 QPS
  • P99 响应时间从 5 秒降至 200 毫秒
  • 库存零超卖,数据一致
  • 系统可在突发流量下保持稳定
代价与风险
  • 架构复杂度大幅上升,运维成本高
  • 缓存与数据库一致性需额外机制保证
  • 异步引入最终一致,用户体验需引导
  • 限流可能误杀正常用户

四、可用性(Availability)

可用性衡量系统"在该用的时候能用"的能力。一台永远不宕机但每秒只能处理一个请求的服务器可用性是 100%,但显然不实用——因此可用性必须与性能共同考虑。可用性是金融、医疗、电信等关键行业最看重的质量属性。

4.1 定义与核心公式

可用性的正式定义
可用性(Availability)指系统在某一时刻能够正确提供服务的概率或时间比例。它是衡量系统"持续可用"程度的关键指标,反映了系统对外正常服务的总时间占比。

衡量可用性有三个核心指标,软考中必须掌握其公式和相互关系:

时间 正常运行 MTTF 故障 MTTR 正常运行 MTTF MTTR MTTF MTBF = MTTF + MTTR 可用度 A = MTTF / (MTTF + MTTR) = MTTF / MTBF
图 6:MTTF、MTTR、MTBF 关系示意图与可用度公式
公式必背:
可用度 A = MTTF / (MTTF + MTTR) = MTTF / MTBF
提升可用性的两条路径:增大 MTTF(让系统更不容易坏)和减小 MTTR(让系统恢复更快)。这两条路径对应不同的可用性战术。

4.2 可用性等级表

业界常用"几个 9"来描述可用性等级。每多一个 9,意味着系统不可用时间大幅缩短,但代价呈指数级上升。

可用性等级可用度年宕机时间典型应用实现难度
2 个 999%3.65 天个人博客、内部工具单机部署即可
3 个 999.9%8.76 小时普通企业系统主备+监控
4 个 999.99%52.6 分钟金融核心、电商双活+故障转移
5 个 999.999%5.26 分钟电信核心网、急救系统多活+冗余全套
6 个 999.9999%31.5 秒航天、核电站控制极端容错设计
考试速算技巧:年总时长 ≈ 525600 分钟。
· 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) · 心跳检测 · 异常检测 · 超时机制 → 快速感知故障 故障后快速恢复 · 表决(多数派) · 主动冗余(热备) · 被动冗余(温备/冷备) · 备件、状态再同步 → 减小 MTTR 阻止故障发生 · 服务从服务中删除 · 事务回滚 · 进程监控 · 优雅降级 → 增大 MTTF 战术应用顺序 预防为主 → 检测为辅 → 恢复兜底,三层防御缺一不可
图 7:可用性战术分类树(错误检测 / 错误恢复 / 错误预防)
战术分类战术说明
错误检测命令/响应主动 ping 远程服务确认存活
心跳周期性发送心跳包,超时判定故障
异常检测监控指标偏离正常范围即告警
超时请求超阈值未响应即判定失败
错误恢复表决多副本投票,少数服从多数(Paxos/Raft)
主动冗余热备:所有副本同时处理,故障时无感切换
被动冗余温备/冷备:主备切换有短暂中断
备件预留备用构件,故障时替换
状态再同步故障恢复后从健康副本同步状态
错误预防服务删除将故障实例从服务列表中摘除
事务回滚事务失败时撤销已执行的变更
进程监控守护进程重启异常退出的服务
优雅降级核心功能保留,非核心功能关闭
客户端 负载均衡 心跳健康检查 故障摘除 实例 A(主) 热备运行中 实例 B(备) 热备运行中 实例 C(故障) 已被健康检查摘除 数据库主 读写 同步 数据库从 只读 / 故障切换 监控告警 异常检测 心跳检测 + 故障转移 + 主备冗余 + 监控告警 = 高可用四件套
图 8:高可用架构示意——心跳检测、主备冗余、故障转移组合应用

4.4 案例:微服务高可用方案

背景:某支付服务采用微服务架构,单实例部署时每年因发布、故障导致宕机约 4 小时,可用性仅 99.95%。业务方要求达到 99.99%。

方案采用可用性战术的组合:

改造结果:MTTR 从平均 30 分钟降至 1 分钟,MTTF 从 1 个月提升至 6 个月,可用度达到 99.995%,年宕机时间小于 26 分钟。

五、可靠性(Reliability)

可靠性与可用性常被混为一谈,但二者关注点不同。可用性关心"系统是否可用",可靠性关心"系统是否正确运行"。一台能正常开机但经常算错账的服务器可用性高但可靠性低。

5.1 定义与可用性的区别

可靠性的正式定义
可靠性(Reliability)指系统在规定条件下、规定时间内完成规定功能的能力,衡量的是"软件在一段时间内不出现故障的概率"。它关注的是系统输出结果的正确性和稳定性,而不仅仅是"在线"。
对比维度可用性 Availability可靠性 Reliability
关注点系统能否被使用系统能否正确运行
度量指标可用度(时间比例)MTBF、失效率、故障率
时间维度瞬时可用概率一段时间内无故障概率
典型问题宕机、不可访问结果错误、数据错乱
提升手段故障转移、冗余错误检测、错误恢复、错误预防
可用性 "现在能不能用?" 系统在线时间比例 A = MTTF / MTBF 关注"是否宕机" 可靠性 "用得对不对?" 一段时间内无故障概率 R(t) = e^(-λt) 关注"是否算错" 相关 可用但不可靠 = 系统在线但算错;可靠但不可用 = 算对但宕机
图 9:可用性与可靠性的核心区别

5.2 可靠性战术

可靠性战术与可用性战术结构相似,但更侧重于错误的检测、恢复与预防,以保证系统输出正确。

可靠性战术 错误检测 错误恢复 错误预防 发现错误 · 命令/响应、心跳 · 异常检测 · 校验和(CRC) · 看门狗 → 发现已发生错误 恢复正确状态 · 表决(多数派) · 主动/被动冗余 · 状态再同步 · 回滚/重做 → 把错误状态恢复回来 防止错误发生 · 服务从服务中删除 · 事务 · 进程监视器 · 退出 / 拒绝行为 → 不让错误有机会发生 可靠性 = 检测发现错误 + 恢复纠正错误 + 预防避免错误 三大类战术常组合使用:CRC 校验发现 → 表决纠正 → 事务预防
图 10:可靠性战术分类树

5.3 案例:航空系统容错设计

背景:飞控系统对可靠性要求极高,单次计算错误可能导致灾难性后果。该系统采用三机冗余+表决架构。

传感器 计算机 A 计算机 B 计算机 C 表决器 多数派决策 2/3 通过 执行器 独立计算相同输入 控制输出 三机独立计算 → 表决器多数派输出,单机故障不影响整体正确性
图 11:航空飞控系统三机冗余表决架构

设计要点:三台计算机硬件异构(不同 CPU、不同操作系统、不同团队实现)以避免共因失效;表决器采用 2/3 多数派策略——任意一台出错不影响输出正确性;每个计算单元均做 CRC 校验与看门狗监控。该方案使系统失效率低于 10⁻⁹/小时。

优势
  • 单点错误可被多数派纠正
  • 硬件异构防止共因失效
  • 看门狗保证检测覆盖
代价
  • 三倍硬件成本
  • 表决引入额外延迟
  • 实现复杂度极高

六、安全性(Security)

安全性是衡量系统抵御非授权访问、保护数据和功能不被破坏的能力。在数据资产化、合规化(GDPR、个保法)的今天,安全性已经成为架构设计的"底线"。

6.1 定义:CIA 三元组

安全性的正式定义
安全性(Security)指系统在向合法用户提供服务的同时,阻止非授权访问、使用、修改、破坏的能力。安全性的核心是 CIA 三元组:
· 机密性(Confidentiality):信息不泄露给非授权方
· 完整性(Integrity):信息不被非授权修改,保持准确完整
· 可用性(Availability):合法用户能正常访问(注意:此处"可用性"是安全视角的,与第四节的运行可用性侧重不同)
机密性 Confidentiality 完整性 Integrity 可用性 Availability CIA 三元组
图 12:安全性 CIA 三元组

6.2 安全性战术

安全性战术围绕"抵抗攻击、检测攻击、从攻击中恢复"展开,本质是对抗非授权访问。

战术分类战术典型实现
抵抗攻击认证账号密码、双因子、生物识别
授权RBAC、ABAC、ACL
数据加密TLS、AES、对称/非对称加密
限制访问防火墙、IP 白名单、网段隔离
数据有效性校验输入校验、参数过滤、防 SQL 注入
检测攻击入侵检测IDS、异常行为分析
审计日志操作日志、合规审计
异常检测行为基线、流量异常告警
从攻击中恢复数据备份定期全量+增量备份
恢复故障回滚、数据还原
攻击者 边界防御 防火墙 WAF DDoS 清洗 IP 白名单 网段隔离 第一道关卡 身份认证 账号密码 双因子认证 数字证书 生物识别 确认"你是谁" 访问授权 RBAC 角色权限 ABAC 属性权限 最小权限原则 确认"能做什么" 数据加密 传输加密 存储加密 签名校验 最后一道 全链路审计日志 + 入侵检测系统(IDS) + 异常行为分析
图 13:安全性纵深防御架构(边界 → 认证 → 授权 → 加密 → 审计)

6.3 案例:银行系统安全架构

背景:某银行核心系统需满足金融合规要求,防御内外部攻击,保护客户资金与隐私。

方案采用纵深防御:

  1. 边界层:互联网出口部署 WAF 拦截 SQL 注入与 XSS;DDoS 清洗中心抗流量攻击;DMZ 区与内网严格隔离,仅开放必要端口。
  2. 身份层:客户登录采用密码+短信验证码双因子认证;内部员工使用数字证书登录堡垒机,所有操作录屏审计。
  3. 授权层:基于 RBAC 划分柜员、主管、审计等角色,遵循最小权限原则;高风险操作(大额转账)需双人复核。
  4. 数据层:传输全程 TLS 加密;数据库中敏感字段(卡号、密码)AES 加密存储;关键表启用行级权限。
  5. 审计层:所有操作落审计日志,日志独立存储且不可篡改(区块链存证);部署 IDS 实时检测异常行为。
战术映射:认证(双因子)+ 授权(RBAC)+ 加密(TLS+AES)+ 审计(日志存证)+ 入侵检测(IDS)—— 五大战术协同,构成完整安全防御体系。

七、可修改性(Modifiability)

可修改性是衡量系统在生命周期中应对变更的能力。软件的"软"就在于可变,但变更的成本差异巨大——好的架构让"加功能"变得轻松,差的架构让"改一行代码"牵动全身。

7.1 定义与度量

可修改性的正式定义
可修改性(Modifiability)指系统在规定时间和成本内完成变更的难易程度。变更可能源于:新增功能、修改已有功能、删除功能、调整性能、适配新技术等。可修改性度量两个维度:修改成本(人力、时间、风险)和变更影响范围(涉及多少模块)。

衡量可修改性的常用指标包括:

7.2 可修改性战术

可修改性战术的核心思想是限制修改的影响范围,即"局部化变更"。Bass 把可修改性战术分为三大类:局部化修改、防止连锁反应、推迟绑定时间。

可修改性战术 局部化修改 防止连锁反应 推迟绑定时间 把变更控制在局部 · 模块化(语义封装) · 信息隐藏(封装细节) · 维持现有接口 · 限制通信路径 → 高内聚低耦合 阻止变更扩散 · 信息隐藏 · 中介者/中间层 · 限制依赖方向 · 重用公共模块 → 阻断变更传导 运行时再决定 · 配置文件 · 运行时注册 · 多态/策略模式 · 插件化 → 不改代码也能变 核心思想:限制变更影响范围 局部化 → 防扩散 → 推迟绑定,三层递进降低修改成本
图 14:可修改性战术分类树

战术速记

  • 模块化:把相关功能聚成模块,模块间低耦合
  • 信息隐藏:接口对外,实现隐藏,内部变更不影响外部
  • 延迟绑定:把决策推迟到运行时(配置、插件、多态)

7.3 案例:插件化架构设计

背景:某 SaaS 平台需要支持多家客户的差异化业务规则,频繁为不同客户定制开发,原架构每加一个客户规则就要改主流程代码,回归测试成本巨大。

方案:采用插件化架构。核心流程抽象为稳定接口(订单处理、计费、风控),具体规则以插件形式实现,通过配置文件指定生效插件。运行时由插件管理器动态加载、注册、调用插件,不同客户启用不同插件组合。

业务请求 核心引擎 流程编排 插件管理器 扩展点定义 稳定不变的核心 接口契约 计费插件 A 客户A规则 计费插件 B 客户B规则 风控插件 通用风控 配置中心 客户启用哪些插件 指定 核心稳定 + 插件可变 + 配置驱动,新增客户规则无需改核心代码 战术应用:模块化(核心/插件分离)+ 信息隐藏(接口契约)+ 延迟绑定(运行时配置)
图 15:插件化架构示意图
优势
  • 新增规则不动核心代码
  • 回归测试范围大幅缩小
  • 支持灰度、A/B 测试
  • 客户定制独立互不影响
代价
  • 前期抽象成本高
  • 插件管理增加运行开销
  • 插件版本兼容性需管理

八、可测试性(Testability)

可测试性衡量系统被测试的难易程度。一个难以测试的系统往往缺陷率高、维护成本大,因为缺陷难以及时发现。可测试性是 CI/CD 与敏捷开发的基础。

8.1 定义与度量

可测试性的正式定义
可测试性(Testability)指通过测试发现软件缺陷的容易程度。可测试性高的系统,测试用例易于编写、执行和控制,缺陷易于暴露和定位。度量指标包括:测试覆盖率(语句、分支、路径覆盖)、缺陷检出率、测试执行时间、测试用例编写成本。

8.2 可测试性战术

可测试性战术的核心思想是让软件内部状态可观察、可控制。Bass 将其分为两类:控制和观察。

战术分类战术说明
控制输入/输出测试接口提供专门测试用的接口与钩子
记录/回放记录线上请求并回放用于测试
模拟/打桩用 Mock 替换外部依赖
内部监视内置监控暴露内部状态、指标、日志
可观察性分布式追踪、日志聚合
测试钩子专门为测试预留的入口
单元测试 数量多 / 速度快 集成测试 模块间接口 系统测试 端到端 验收测试 业务验证 数量少 / 速度慢 / 价值高 快 反馈快 慢 成本高 少 数量少 多 用例多
图 16:测试金字塔——单元测试为底,验收测试为顶
测试金字塔原则:底层单元测试数量最多、执行最快,应占 70% 以上;顶层验收测试数量最少、执行最慢。倒金字塔(UI 测试为主)会导致反馈慢、维护成本高,是常见反模式。

8.3 案例:自动化测试体系

背景:某团队每周发布一次,每次发布前手工回归测试需 3 天,且经常遗漏缺陷导致线上事故。

方案:建立分层自动化测试体系。单元测试覆盖率要求 80%,集成测试覆盖核心接口,关键路径有端到端测试;引入 Mock 解决外部依赖问题;CI 流水线在每次提交自动运行单元测试,每次合并自动运行集成测试,每天定时运行端到端测试;为内部状态暴露监控接口便于诊断。

结果:发布前手工测试从 3 天降至 4 小时;线上缺陷率下降 60%;平均缺陷发现时间从天级降至分钟级。
战术应用:测试接口 + Mock 打桩 + 监控接口(可观察性)+ 测试钩子。

九、质量属性场景

质量属性本身是抽象的,要让它"可设计、可评估",必须用质量属性场景将其具体化。这是软考中 ATAM(架构权衡分析法)等评估方法的基础。

9.1 场景的六大要素

质量属性场景六要素
1. 刺激源(Source):产生刺激的实体(用户、外部系统、内部构件)
2. 刺激(Stimulus):到达系统的事件(请求、故障、攻击、变更需求)
3. 制品(Artifact):被刺激影响的部分(整个系统、特定模块、特定数据)
4. 环境(Environment):刺激发生时的系统状态(正常运行、过载、降级、离线)
5. 响应(Response):系统对刺激的处理行为(处理请求、记录日志、拒绝访问、回滚)
6. 响应度量(Response Measure):响应的可量化指标(响应时间、可用度、是否拦截)
刺激源 Source 刺激 Stimulus 制品 Artifact 受影响部分 环境 Environment 系统状态 (运行/过载/降级) 响应 Response 响应度量 Measure 刺激源 → 刺激 → 制品/环境 → 响应 → 响应度量,五步串联成场景
图 17:质量属性场景六大要素结构

理解场景六要素的关键在于"响应度量"——它是质量属性的量化锚点。没有度量的场景只是模糊需求,例如"系统要快"无法评估,而"用户在高峰期发起查询请求,系统在 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 战术分类总览图

质量属性战术 性能 可用性 可靠性 安全性 可修改性 可测试性 资源需求 资源管理 资源仲裁 错误检测 错误恢复 错误预防 错误检测 错误恢复 错误预防 抵抗攻击 检测攻击 从攻击恢复 局部化修改 防止连锁 推迟绑定 控制IO 内部监视 战术组合 → 架构模式 缓存+并发+限流 → 读写分离 / 缓存架构 | 冗余+故障转移+心跳 → 主备/双活 | 认证+授权+加密 → 纵深防御 考点提示 战术是模式的最小构建单元;同一战术可服务于多个质量属性(如"冗余"同时提升可用性与可靠性)
图 18:质量属性战术总览及与架构模式的映射
战术与模式的关系
战术是设计决策的"原子",粒度小、单一职责;架构模式是战术的组合,粒度大、解决一类问题。例如"主备冗余"模式 = 心跳检测 + 主动冗余 + 故障转移 + 状态再同步 四个战术的组合。考试中常考"某架构应用了哪些战术",需从模式反推战术。

十一、质量属性权衡

质量属性之间并非独立,它们相互影响、彼此制约。架构师的核心工作不是"全都要",而是在冲突中做权衡(Trade-off)。理解权衡是软考论述题拿高分的关键。

11.1 典型冲突对

冲突对冲突原因典型权衡策略
性能 vs 安全性加密、校验、审计都增加开销核心数据强加密,非核心明文;异步审计
可用性 vs 成本多副本、多活成本高分级可用性,核心多活非核心单点
可修改性 vs 性能抽象层、间接调用降低运行效率热点路径直连,非热点分层
安全性 vs 易用性多因子认证、复杂密码降低体验风险分级,低风险操作简化认证
可测试性 vs 性能测试钩子、监控埋点增加开销测试接口可开关,生产环境关闭
可靠性 vs 成本三机冗余、CRC 校验成本高关键路径冗余,非关键路径单点
性能 可用性 可靠性 安全性 可修改性 权衡方案 性能/可用性优先 六大属性不可能同时拉满,必须取舍
图 19:质量属性权衡雷达图(六维不可兼得)

11.2 权衡矩阵

性能 可用性 安全性 可修改性 性能 可用性 安全性 可修改性 — 冲突 冗余增加延迟 冲突 加密耗资源 冲突 分层降效率 冲突 冗余增加延迟 — 协同 同属CIA 冲突 多副本难改 冲突 加密耗资源 协同 同属CIA — 冲突 审计加复杂 冲突 分层降效率 冲突 多副本难改 冲突 审计加复杂 — 冲突 协同 无关
图 20:质量属性冲突与协同矩阵

11.3 案例:权衡分析实例

背景:某在线医疗系统需同时满足:高峰期响应≤500ms(性能)、年宕机≤52分钟(可用性)、患者数据加密存储(安全性)、支持快速接入新医院(可修改性)。这四项需求存在明显冲突。

冲突分析
· 性能 vs 安全性:全链路加密会使响应增加 50~100ms
· 可用性 vs 可修改性:多副本部署让"改一处"变成"改多处"
· 性能 vs 可修改性:分层抽象引入额外调用开销

权衡方案采用分级策略:

  1. 分级安全:核心数据(病历、处方)强加密存储+传输加密;非核心数据(公告、科普)明文,降低性能损耗。
  2. 分级可用:核心服务(挂号、问诊)三副本多活;非核心服务(资讯、统计)单点+定时备份,降低修改成本。
  3. 分级性能:热点路径(挂号查询)直连缓存,绕过抽象层;非热点路径分层设计保证可修改性。
  4. 分级修改:医院接入走插件化接口(延迟绑定),核心诊疗流程保持稳定。
权衡结论:通过"分级"把冲突局部化,让每个层级只承担与其价值匹配的质量诉求,最终四项指标全部达成。权衡的本质是不追求全局最优,而是寻找帕累托次优解。

十二、软考真题解析与考点总结

12.1 常见题型

软考系统架构设计师中,质量属性相关考点主要出现在综合知识(选择题)、案例分析(简答+设计)和论文三大模块。

题型考查方式高频考点
选择题给战术归类、辨析概念战术归属、六要素名称、可用度公式
案例题给场景分析使用了哪些战术/质量属性从架构反推战术、写质量属性场景
论文题结合项目论述质量属性设计权衡分析、战术应用、场景驱动设计

12.2 必背公式与数据

核心公式
· 可用度 A = MTTF / (MTTF + MTTR) = MTTF / MTBF
· MTBF = MTTF + MTTR
· 并发数 = 吞吐量 × 平均响应时间(Little's Law)
· 可靠性 R(t) = e^(-λt),λ 为失效率
· 年宕机分钟 = (1 - A) × 525600
"几个 9"速记:3个9=8.76h,4个9=52.6min,5个9=5.26min,6个9=31.5s。每多一个9,宕机时间缩短约 60 倍,实现成本上升约 10 倍。

12.3 记忆口诀

六大属性速记口诀

  • 性、用、靠、安、改、测——性能、可用性、可靠性、安全性、可修改性、可测试性
  • 运行质量"快稳靠安":性能快、可用稳、可靠不宕、安全不破
  • 演化质量"改测移协":可改、可测、可移、可互操作

战术分类速记

  • 性能:需求(缓存)→ 管理(并发)→ 仲裁(限流)
  • 可用/可靠:检测(心跳)→ 恢复(冗余)→ 预防(降级)
  • 安全:抵抗(认证加密)→ 检测(审计)→ 恢复(备份)
  • 可修改:局部化(模块)→ 防连锁(中间层)→ 推迟(配置)
  • 可测试:控制IO(Mock)→ 监视(钩子)

场景六要素速记

"源、激、制、境、响、量"——刺激源、刺激、制品、环境、响应、响应度量。前五个是"发生了什么",最后一个是"做得怎么样"。

12.4 典型真题示例

真题示例 1(选择题)
某系统采用主备冗余、心跳检测、故障自动切换,这些战术主要提升的质量属性是?
A. 性能 B. 可用性 C. 可修改性 D. 可测试性
答案:B。主备冗余+心跳+故障转移是典型的可用性战术(错误检测+错误恢复)。
真题示例 2(选择题)
提高可用性的两条路径是增大 MTTF 和减小 MTTR,下列哪项主要减小 MTTR?
A. 冗余 B. 限流 C. 加密 D. 模块化
答案:A。冗余使故障后能快速切换恢复,缩短 MTTR;而提高 MTTF 多靠预防性战术。
真题示例 3(案例题)
请用质量属性场景描述"系统在遭受 DDoS 攻击时仍能对外提供服务"。
参考答案:刺激源=攻击者;刺激=DDoS攻击;制品=网关与核心服务;环境=正常运行;响应=流量清洗+限流+降级保核心;响应度量=核心接口可用度≥99.9%,P99≤1s。

12.5 论文写作要点

质量属性是论文题的高频主题。写作时建议遵循"场景→战术→模式→验证"四段式结构:

  1. 场景:用六要素描述项目中的质量需求,体现需求来源
  2. 战术:明确列出选用了哪些战术,归到哪一大类
  3. 模式:说明战术如何组合成架构模式,落地为哪些构件
  4. 验证:给出度量指标与实际效果数据,证明设计有效
全文核心总结
1. 六大属性必背:性能、可用性、可靠性、安全性、可修改性、可测试性
2. 可用度公式必背:A = MTTF / (MTTF + MTTR)
3. 战术分类必背:每个属性的三类战术及代表战术
4. 场景六要素必背:源、激、制、境、响、量
5. 权衡思想必背:属性间冲突普遍存在,分级处理是常用手段
6. CIA三元组必背:机密性、完整性、可用性
7. 战术与模式关系:战术是原子,模式是组合
8. 答题要诀:六要素齐全、公式准确、战术归类正确、权衡有据

质量属性不是孤立的指标,而是贯穿架构设计全过程的决策指南。从需求阶段的场景刻画,到设计阶段的战术选择,再到评估阶段的度量验证,质量属性提供了一条从"业务价值"到"技术实现"的完整闭环。掌握它,就掌握了架构设计的"权衡之术"——这正是系统架构设计师区别于普通工程师的核心能力。