乐于分享
好东西不私藏

【软件系统架构】系列十三:系统架构设计——系统质量属性与架构评估

【软件系统架构】系列十三:系统架构设计——系统质量属性与架构评估

一、软件系统质量属性

1.定义

软件质量:软件系统与明确/隐含需求一致的程度。

维度划分(六大方面):

  • 功能性:适合性、准确性、互操作性、依从性
  • 可靠性:容错性、易恢复性、成熟性
  • 易用性:易学性、易理解性、易操作性
  • 效率:时间特性、资源特性
  • 维护性:可测试性、可修改性、稳定性、易分析性
  • 可移植性:适应性、安装性、一致性、替换性

2.分类

  • 开发期质量属性:易理解性、可扩展性、可重用性、可测试性、可维护性、可移植性
  • 运行期质量属性:性能、安全性、可伸缩性、互操作性、可靠性、可用性、鲁棒性

二、面向架构的质量属性与设计策略

属性 关注点 常见度量 架构设计策略 验证方法 常见误区
性能
响应速度、吞吐量、容量
响应时间 (P95/P99)、TPS/QPS、资源利用率
优先队列、并发/异步处理、资源调度、缓存、连接池、批处理、零拷贝
压测(基准/容量/长稳)、APM(延迟曲线)、火焰图分析
只看平均响应时间,忽视长尾性能;盲目加缓存导致数据陈旧
可靠性
系统无故障持续运行
MTTF、MTBF、故障率、重试成功率
心跳、冗余、副本、主备/选举、容错机制(重试+幂等)、事务/补偿
混沌工程、故障注入、断网/抖动演练、数据恢复演练
有重试无幂等;有副本无一致性保障;只依赖人工恢复
可用性
系统在给定时间内可用比例
可用性 A=MTBF/(MTBF+MTTR)、MTTR、停机时长
健康检查、监控告警、快速恢复、冗余部署、熔断/降级、流量切换(灰度/蓝绿/多活)
SLO/错误预算跟踪、演练(故障演练/应急演练)、恢复时间度量
把”有冗余”当等于”高可用”;未考虑灾备演练与组织响应
安全性
保密性、完整性、可控性、可用性(CIAA)
入侵检测率、防护率、攻击检测时间、数据泄漏概率
强身份认证(OIDC、mTLS)、最小权限授权(RBAC/ABAC)、加密(传输/静态/端到端)、输入校验、入侵检测/防御(IDS/IPS)、审计追踪
渗透测试、红蓝对抗、安全扫描、合规审计
只做登录+HTTPS,忽略权限粒度、日志审计、密钥轮换
可修改性
系统在低成本下变更的能力
修改代价(工时)、影响范围、回归测试规模
模块化、接口-实现分离、信息隐藏、抽象层、插件化、配置化、特性开关
变更演练(一天改法)、静态分析、回归覆盖率、影响面分析
盲目拆微服务导致复杂度更高;无弃用策略
功能性
系统完成预期任务的能力
功能覆盖率、缺陷密度、需求满足率
职责清晰、模块协作、领域驱动设计(DDD)、契约优先(OpenAPI/gRPC)
用例测试、契约测试、用户验收测试
只验证Happy Path,忽略边界/异常;功能文档与实现脱节
可变性
架构支持产品族扩展的能力
特性覆盖度、配置灵活性、产品变体数量
特性建模(Feature Model)、配置规则、参数化、插件化、模板化
特性矩阵回归测试、配置组合演练
缺乏约束导致组合爆炸;配置项过多不可控
互操作性
与外部系统交互能力
协议兼容性、Schema 兼容率、集成缺陷率
标准接口(HTTP/REST/gRPC/MQTT)、数据映射与适配层、版本化契约、兼容性测试矩阵
集成测试、契约测试、跨平台演练
只对接一次不做演进计划;忽视版本兼容与弃用策略

解析要点:

1.质量属性之间的权衡关系
  • 性能 vs 一致性:缓存/异步提升性能,但可能牺牲数据实时一致性。
  • 可用性 vs 成本:冗余/多活架构提升可用性,但带来资源和运维成本。
  • 安全性 vs 易用性/性能:强认证与加密增加交互复杂度与延迟,需要设计平衡方案(如硬件加速、单点登录)。
  • 可修改性 vs 稳定性:频繁改动可能引入不稳定;需通过特性开关与灰度策略降低风险。
2.QAS(质量属性场景)化

每一个质量目标必须用 QAS 模板表述,才能进入架构评审和测试:

在【环境】下,当【刺激源】发出【刺激】作用于【制品】时,系统应【响应】,并以【响应度量】验证。

例:在高峰期(环境),用户请求下单(刺激源+刺激)作用于订单服务(制品),系统应返回成功响应并写入日志(响应),并保证 P95 延迟<200ms,错误率<0.1%(度量)。

3.落地清单
  • 每个属性都有 度量指标 + 架构战术 + 验证手段
  • 为运行期属性绑定 SLO/错误预算
  • 为开发期属性建立 ADR(架构决策记录)+演练(变更/兼容)
  • 在 CI/CD 中集成 契约测试、性能压测、安全扫描、混沌工程
  • 定期复盘质量属性的权衡点与敏感点(ATAM 方法)

三、质量属性场景(QAS)

场景六要素:刺激源 → 刺激 → 环境 → 制品 → 响应 → 响应度量

常见场景示例

  • 可用性:系统在高负载下故障,需在 5 分钟内恢复,并通知管理员。
  • 性能:正常模式下用户请求响应 <200ms,吞吐量 ≥1000 req/s。
  • 安全性:非法访问尝试应 3 秒内阻断,并记录审计。
  • 可修改性:新增功能修改应在 1 天内完成,且不影响现有功能。
  • 易用性:新用户 30 分钟内掌握核心操作,错误率 <5%。

四、系统架构评估方法

1.SAAM(场景驱动架构分析)

  • 最早的方法,侧重 可修改性
  • 流程:场景开发 → 架构描述 → 单场景评估 → 场景交互 → 总体评估

2.ATAM(架构权衡分析)

  • 核心工具:效用树(Utility Tree)
  • 目标:识别敏感点、权衡点、风险点
  • 适用属性:性能、可用性、安全性、可修改性
  • 场景类型:用例场景、增长场景、探测场景

3.CBAM(成本效益分析)

  • 在 ATAM 基础上引入 ROI

  • 步骤:

  • 整理并优先级化场景

  • 策略-场景-响应对应关系

  • 分配效用并计算收益

  • 扣除成本,选择 ROI 最高的架构策略

4.其他方法

  • SAEM:内部/外部质量属性双重视角
  • SAABNet:基于 BBN 的定性推理
  • SACMM:修改性度量
  • SASAM:架构静态对比
  • ALRRA:可靠性风险评估(基于 FMEA)
  • AHP:层次分析法,定性问题定量化
  • COSMIC+UML:维护性度量与演化方案验证

五、架构评估关键要点

1. 敏感点(Sensitivity Points)

定义

敏感点是指 架构中对某一特定质量属性非常敏感的组件、模块或设计特性。一旦这些部分发生变化或失效,就会显著影响该质量属性。

特征
  • 仅影响 单一或少数几个质量属性
  • 对性能、可用性、可扩展性等某一方面非常关键
  • 变化会造成 局部性能或行为明显波动
识别方法
  • 基于场景(Scenario-Driven):分析具体使用场景中哪些组件承载了核心功能。
  • 历史经验:查看类似系统中,哪些模块容易成为瓶颈。
  • 建模分析:性能分析(如负载、响应时间)、可靠性分析(MTBF)等。
示例
  • 缓存模块:对性能敏感,如果缓存策略设计不当,可能导致响应延迟增大。
  • 数据库连接池:对吞吐量敏感,池配置不足会导致请求阻塞。
  • 安全认证模块:对安全性敏感,缺陷可能导致系统被攻破。

2. 权衡点(Trade-off Points)

定义

权衡点是指 架构中对多个质量属性存在相互影响的设计决策点。优化一个属性可能会牺牲另一个属性。

特征
  • 同时影响多个质量属性(性能、成本、可用性、可维护性等)
  • 需要权衡不同目标,做出折中决策
  • 常见于跨层设计、系统级决策
识别方法
  • 列出系统主要质量属性及优先级
  • 对设计方案进行”多属性影响分析”
  • 使用效用树(Utility Tree)或权衡矩阵分析不同设计方案对质量属性的影响
示例
  • 冗余设计:增加冗余节点提高可用性,但增加成本和运维复杂度
  • 异步消息队列:提高吞吐量和可伸缩性,但可能增加系统延迟和一致性复杂性
  • 加密策略:增强安全性,但可能降低性能

3. 风险点(Risk Points)

定义
风险点是指 可能导致架构失败或严重质量问题的潜在隐患。风险点通常是系统最脆弱的地方,需要重点关注和缓解。

特征
  • 可能对多个质量属性产生负面影响
  • 通常难以通过单次测试发现
  • 与复杂性、技术成熟度、依赖外部组件相关
识别方法
  • 技术成熟度分析:新技术或组件的集成风险高
  • 架构复杂性分析:高度耦合或依赖链长的模块是高风险点
  • 历史问题分析:参考过往系统故障记录
  • 敏感点与权衡点的交叉:敏感点+权衡点可能成为潜在风险点
示例
  • 单点故障:核心服务节点出现故障会导致系统不可用
  • 第三方库依赖:第三方库漏洞可能导致安全风险
  • 复杂事务流程:跨系统事务失败可能影响数据一致性
小结:
类型 关注点 识别方式 示例
敏感点
单一质量属性敏感
场景分析、性能建模
缓存、数据库连接池
权衡点
多个质量属性冲突
权衡矩阵、效用树
冗余设计、加密策略
风险点
潜在隐患、系统脆弱
技术成熟度、复杂性分析
单点故障、第三方依赖

六、总结

  • 质量属性是架构评估的核心,决定架构设计成败。
  • **场景化(QAS)**是从抽象需求到可验证标准的关键。
  • SAAM → ATAM → CBAM 构成了逐步深入的评估链条:
  • SAAM:分析单一属性
  • ATAM:识别权衡与风险
  • CBAM:加入 ROI 做决策
  • 架构评估 ≠ 测试,而是设计阶段的风险识别与权衡决策工具