Day29-05|8.1.1 质量属性概念:从“系统能做什么”到“系统做得怎么样”
Day29-05|8.1.1 质量属性概念:从“系统能做什么”到“系统做得怎么样”
一、教材定位
系统质量属性与架构评估是高级系统架构设计师综合知识、案例分析和论文写作的共同基础。功能需求回答系统要完成哪些业务活动,质量属性回答系统在什么约束下、以什么水平完成这些活动。一个系统即使功能完整,如果响应缓慢、频繁不可用、数据不安全、无法维护或不能适应变化,仍然不能称为高质量系统。
质量属性不是测试阶段才补充的指标,而是贯穿需求、架构、设计、实现、部署和运维全过程的约束。架构师的核心工作之一,就是把“系统要可靠”“要快”“要安全”“要容易维护”这类模糊期望,转化为可观察、可度量、可验证的质量属性场景,并通过架构决策实现它们。
二、质量属性的定义
软件质量属性是反映软件系统满足明确或隐含要求程度的特征集合。它描述系统除业务功能以外的行为和特性,包括性能、可用性、安全性、可维护性、可移植性、互操作性、可靠性、易用性和可测试性等。
质量属性具有三个特点。第一,它通常是系统级或架构级特征,不能只由一个函数或一个页面决定。第二,不同质量属性之间存在权衡,例如更强的一致性可能牺牲部分可用性和性能,更高的安全校验可能增加响应时间。第三,质量属性必须结合场景和指标,否则很难判断是否满足。
| 质量属性 | 核心问题 | 常见度量 |
|---|---|---|
| 性能 | 系统处理请求有多快、吞吐有多大 | 响应时间、吞吐量、并发数 |
| 可用性 | 系统在需要时能否提供服务 | 可用率、故障时间、恢复时间 |
| 可靠性 | 系统在规定时间内无故障运行能力 | MTBF、失败率、数据正确率 |
| 安全性 | 能否防止未授权访问和破坏 | 漏洞数、拦截率、审计覆盖率 |
| 可维护性 | 修改、定位、测试和部署是否容易 | 修改时间、缺陷修复时间 |
| 可扩展性 | 负载或功能增长时能否平稳扩展 | 扩容效率、性能衰减 |
| 可移植性 | 能否迁移到不同环境 | 迁移成本、兼容范围 |
| 互操作性 | 能否与其他系统正确协作 | 接口成功率、兼容性 |
三、功能需求与质量属性的区别
“用户可以提交订单”是功能需求,“提交订单接口在峰值负载下95%的请求响应时间不超过300毫秒”是性能质量场景;“管理员可以查询审计记录”是功能需求,“关键操作必须在5分钟内进入不可篡改审计存储并支持按操作者追踪”是安全和可追溯性要求。
功能需求常可通过功能测试判断是否完成,质量属性通常需要架构设计、专门测试、运行监控和治理机制共同保证。架构师若只写功能模块而不写质量属性,方案就无法支撑高级考试中的架构权衡。
四、常见质量属性及架构影响
1. 性能
性能包含响应时间、吞吐量、并发能力、资源利用率和容量。性能设计可能涉及缓存、异步处理、批量处理、索引、读写分离、分片、连接池和负载均衡。不能只写“使用缓存提高性能”,还要说明缓存什么、失效策略、一致性影响和缓存故障时如何降级。
2. 可用性
可用性关注系统在规定时间内可被访问和正确提供服务的能力。架构措施包括冗余、集群、健康检查、故障转移、限流、熔断、降级、备份和灾备。可用性不是简单增加服务器数量,还要分析单点、数据恢复、依赖服务和运维操作造成的风险。
3. 可靠性
可靠性强调在指定条件和时间内持续正确运行。它不仅关注“服务还在线”,还关注结果是否正确、数据是否完整、事务是否可恢复。幂等、事务、校验、重试、补偿、故障注入和数据一致性验证都是可靠性设计的重要手段。
4. 安全性
安全性包括机密性、完整性、可用性、可认证性、可授权性、不可否认性和可审计性。架构设计需要考虑身份认证、访问控制、最小权限、数据加密、密钥管理、输入校验、边界防护、日志审计和漏洞响应。安全措施也会带来性能、可用性和易用性的权衡。
5. 可维护性
可维护性包括可分析、可修改、可测试和可部署。模块边界清晰、接口稳定、代码规范、自动化测试、统一日志、配置治理和持续交付都能提高可维护性。可维护性是架构长期成本的重要决定因素,不能只在项目后期通过代码重构补救。
6. 可扩展性
可扩展性包括容量扩展和功能扩展。水平扩展要求实例无状态或状态可外置;功能扩展要求通过插件、策略、事件和稳定接口隔离变化。可扩展性不是无限扩展,还要说明扩展上限、成本和性能退化边界。
五、质量属性之间的权衡
架构设计不存在所有质量属性同时达到最高的方案。质量属性之间可能相互促进,也可能相互冲突。例如缓存能够提高性能,但会引入数据一致性问题;多副本能够提高可用性,但会增加一致性和运维复杂度;强身份校验能够提高安全性,但可能增加登录时延;微服务能够支持团队自治和独立扩展,但会增加网络、部署和监控复杂度。
架构师应把权衡写成决策:目标质量属性是什么,候选方案有哪些,分别获得什么收益,付出什么代价,最终为什么选择当前方案,如何验证结果。只罗列技术名词不能体现架构能力。
六、质量属性场景
质量属性场景把抽象质量要求转化为可验证描述,通常包含刺激源、刺激、环境、受影响对象、响应和响应度量六个部分。例如性能场景可以写成:在促销活动期间,外部用户并发提交订单,系统处于峰值负载环境,订单服务接收请求并完成校验和受理,95%的请求响应时间不超过300毫秒,吞吐量不低于每秒5000笔。
| 要素 | 说明 | 示例 |
|---|---|---|
| 刺激源 | 谁或什么产生刺激 | 用户、外部系统、故障 |
| 刺激 | 发生了什么 | 并发请求、节点宕机 |
| 环境 | 在什么条件下发生 | 峰值、维护、网络分区 |
| 受影响对象 | 系统哪个部分受到影响 | 订单服务、数据库 |
| 响应 | 系统应该怎么做 | 限流、切换、告警 |
| 响应度量 | 如何判定达标 | 300毫秒、5分钟恢复 |
场景化表达让需求、架构和测试建立对应关系。一个质量场景应能追踪到架构策略、实现机制、测试用例和运行指标。
七、质量属性驱动架构设计
质量属性驱动设计通常先识别业务目标和关键场景,再确定优先级,分析影响质量的架构决策,选择设计策略,建立原型或基线,最后通过评估和测试验证。架构师应优先处理不可逆、影响范围大或验证成本高的决策。
例如系统要求高可用,不能只写“部署集群”,还要分析负载均衡是否单点、会话如何处理、数据库如何切换、消息是否丢失、故障期间用户如何感知、恢复后如何补偿,以及如何通过演练证明目标。
八、案例分析:政务申报系统的质量属性
某政务申报系统功能包括事项查询、材料提交、在线审批和结果通知。质量目标包括高峰期稳定、关键材料安全、审批过程可追溯和规则变化易维护。
架构上,查询采用缓存和读扩展,提交链路采用对象存储和病毒检测,审批过程使用显式状态和事件记录,敏感材料进行加密和细粒度授权,规则通过版本化策略管理,关键操作写入审计中心。高峰期采用限流和排队保护核心数据库;通知失败不阻塞审批状态,并通过重试和人工补偿处理。评估时分别进行峰值压测、权限越权测试、材料完整性测试、节点故障演练、规则变更回归和审计追踪验证。
这个案例说明质量属性不是架构图旁边的附加说明,而是直接决定数据、服务、接口和部署方式的设计约束。
九、练习题
题1
“系统可靠、性能好、安全性高”为什么不能直接作为可验收要求?
参考答案
这些描述缺少刺激、环境、响应和度量,无法判断何时满足。应将其转化为质量属性场景,例如在峰值并发下95%请求小于某个响应时间,节点故障后在规定时间内恢复,未授权访问被拒绝且关键操作可审计。
题2
缓存同时可能改善和损害哪些质量属性?
参考答案
缓存通常改善性能和部分可用性,但可能损害数据一致性、可维护性和故障可诊断性。设计时需要确定缓存对象、过期和失效策略、更新方式、容量、穿透和雪崩保护,以及缓存故障时的降级方案。
题3
如何把“系统易维护”转化为架构设计?
参考答案
通过清晰模块边界、稳定接口、统一日志、可追踪调用链、自动化测试、配置治理、持续交付、可回滚发布和架构文档实现,并用修改周期、缺陷定位时间、测试覆盖和发布失败率等指标验证。
十、论文写作素材
论文中可以围绕“质量属性驱动的架构设计”展开:项目初期识别性能、可用性、安全性和可维护性场景,建立优先级和指标;针对关键场景分别采用缓存与异步、冗余与故障切换、身份与审计、模块化与自动化测试等策略;通过压测、故障演练、安全测试和运行监控验证;在发现一致性、运维复杂度或成本问题后进行权衡和调整。这样能够体现从目标到策略再到证据的完整链条。
十一、今日复盘
质量属性是系统“做得怎么样”的要求,必须场景化、度量化和可验证化。复习时重点掌握:功能需求与质量属性的区别;常见质量属性对架构的影响;质量属性之间的权衡;质量属性场景六要素;如何把质量目标落实为架构策略和测试证据。