尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

架构评估不再凭感觉:效用树构建质量属性场景实战

架构评估不再凭感觉:效用树构建质量属性场景实战 上个月帮一家在线教育公司做架构评估业务方开场就一句话“帮我们看看现在的系统能不能再撑三年。”这种需求我一年能碰到十几次。看起来是评估系统实际背后的痛点可能是大促快到了、融资尽调要交架构说明、或者线上事故频发被老板下了最后通牒。但不管背后是哪种情况我做的第一件事永远是同一个先跟所有利益相关方把一棵质量属性效用树建起来。这棵树要是没立住后面的评估会议大概率会变成各说各话的“我觉得该改这里”“我觉得那边更重要”的争吵现场。先说明白系统架构评估核心不是看功能做得多全而是看这套架构在质量属性上能不能满足长远需要。质量属性是什么是性能、可用性、安全性、可维护性、可扩展性这些非功能需求是“用户下单在几秒内完成”“大促流量打进来会不会挂”“加一个节点能不能线性扩容”这类问题。而效用树Utility Tree就是把大而空的质量属性逐层拆成具体的、可讨论、可度量的场景让架构评估从“感觉还行”变成“有依据地判断行不行”。这篇文章适合架构师、技术负责人以及马上要参加架构评估的一线开发。我会从为什么评估一定要用效用树讲起然后给你一套从零开始构建效用树和落地执行的完整方法最后把我在实操里踩过的坑、总结出的经验也一并交代清楚。1. 为什么架构评估一定要落到质量属性上1.1 架构评估到底在评估什么很多团队理解的架构评估就是组织几个技术大佬把系统架构图拿出来围绕分层、模块化、技术栈讨论有没有问题。这种评审会我参加过太多结果通常是每个人基于自己的经验提出一堆改进建议最后形成一份很长但没人能执行的总结。问题出在哪出在评估对象不统一。架构评估的对象应该是一组明确的质量属性场景而不是“架构”这个抽象的东西。架构本身没有绝对的好坏只有在某个具体场景下它是好还是不好才有讨论价值。比如一套“所有服务都写在一个单体应用里”的架构如果业务是内部OA系统、几十个人用那它就是一个很好很合理的架构但如果业务是面向全网的大流量电商这个架构在性能、可用性、可扩展性每一项质量属性上可能都不合格。所以走出评估的第一步就是把评估的载体从“架构图”换成“质量属性场景”。架构评估最终要回答的问题不是“这个技术方案好不好”而是“这套系统在给定场景下当业务发生某种变化或遇到某种压力时是否仍然能够满足需求”。每个场景就是一次对架构的“压力测试”。1.2 什么时候需要做一次正式的架构评估结合我自己的经历架构评估在以下几种场景下是刚需。第一种是业务增速明显高于系统演进速度团队已经开始频繁出现线上告警、事故复盘、性能瓶颈兜不住的局面。这个时候评估是“救火型”的目的是找到最紧迫的短板优先补齐。第二种是大规模改造之前的评估比如要把单体拆微服务、要把数据库从单库往分布式迁移、要做跨机房容灾。这种时候评估相当于“动手术前的全面体检”避免改造完了发现更大的窟窿。第三种是面向外部或高层决策的评估比如融资尽调、重大客户要求提供架构安全性说明、CTO要在董事会层面确认技术战略方向。这种评估要求有完整的推导链、可量化的结论不能只是“我们架构师团队觉得还行”。第四种是长期没有做过系统性评估的成熟系统团队日常只做功能迭代。这种系统最有必要补一次评估因为架构腐化是渐进的你不会在某一天突然发现系统烂透了但回头对比两年前的架构通常已经变得触目惊心。不管哪种触发场景都需要先构建质量属性效用树因为它就是评估的“评分标准”。没有标准就去打分每个人打出来的分自然没有可比性。2. 效用树到底是什么为什么它能撑起整场评估2.1 效用树的结构与核心逻辑效用树这个名字在我刚接触的时候也觉得有点玄乎但说白了它就是一棵结构化展开的树状图。根节点是“系统的整体效用”也就是系统到底能提供多大价值。第二层是质量属性比如性能、可用性、安全性、可维护性、可扩展性。第三层是把每个属性细化为具体的子类别比如性能下面可以再分“延迟”和“吞吐量”。最底层的叶子节点是最终的具体场景必须描述得足够具体能拿来讨论、能设定指标、能被架构推演。效用树最核心的价值在于强制“分层”。没有这棵树的时候大家讨论性能往往停留在“系统响应有点慢”“得做优化”这种模糊层面。有了效用树叶子节点必须是“在晚高峰并发增长300%的条件下核心下单接口的P99延迟不超过2秒”这种明确描述。模糊的讨论自然就变成了可执行的分析。在这个结构里每个叶子节点还需要附带两个东西一个是场景的详细描述另一个是优先级比如用高/中/低来表达。优先级的意义在于架构评估的资源有限不可能把每个质量属性都做到极致先保哪些、牺牲哪些这本身就是架构决策的核心内容。2.2 为什么是效用树而不是需求文档或者问题清单有人可能觉得团队已经有详细的非功能需求文档每条也写得很清楚为什么还要建效用树我的回答是文档适合存档但不适合讨论。效用树是一种“可以在会上协作、可以实时修改、能让所有人看到全局”的评估工具。效用树有几个需求文档替代不了的特点。第一它突出优先级权重。PRD里每一行非功能需求都是“重要的”但效用树强制你给每条场景打优先级这一打利益相关方之间真实的分歧就浮现出来了。业务方最关心可用性运维最关心可维护性产品最关心易用性谁排前面这个排序本身就是非常关键的架构输入。第二它是分层的能看到“质量属性 → 子分类 → 场景”的完整路径而不是摊平的一组条目。这样在做权衡分析的时候你能一眼看出来“性能”下面哪些场景优先级更高当某个架构方案提升延迟但降低可维护性时受影响的具体是哪些叶子节点。第三它是活的。从建树到评估到追踪整改效用树可以持续更新和复用。每次做架构评估不用从零开始拿上次的树做增量调整就行。我见过不少团队一棵效用树从第一次评估开始持续用两三年每次业务变化就更新叶子节点非常高效。2.3 效用树的三个关键层级到底怎么划分我讲讲实际操作中层级怎么定比较稳妥。第一层是质量属性类别通常用主流的六到十个属性性能、可用性、安全性、可维护性、可移植性、易用性、可测试性、可扩展性、成本效益。不用追求全覆盖这次评估真正关心的领域就够了。第二层是属性细化维度。比如性能这里可以拆成“响应延迟”“吞吐量”“容量”可用性这里可以拆成“故障恢复”“容错能力”“备份与灾备”安全性这里可以拆成“访问控制”“数据安全”“隐私合规”。这一层的作用是避免在属性层面空聊给具体场景一个分类的“抽屉”。第三层是叶子节点也就是具体的质量属性场景。这是一棵效用树里工作量最大的部分也是真正产生价值的部分。叶子节点必须满足“可度量、可测试、可讨论”三个条件否则它就不应该出现在树里。3. 从零开始构建一棵能用的效用树完整实操流程3.1 第一步先把利益相关方找齐建效用树不是架构组关起门自己画而是要把真正关心系统长期价值的各方拉到一个会议室里。我一般会请这几类角色业务产品负责人他们知道业务未来的方向、运维与SRE他们知道系统在线上最真实的痛点、安全合规如果涉及敏感数据、一线开发他们最清楚代码层的可维护性现状、以及数据或算法团队如果系统的瓶颈可能在数据链路。一开始就让多方参与能省掉后面大量沟通成本。等效用树建完再拉人进场对方的第一反应往往是“这个优先级我不认”。所以从一开始就让所有相关方参与进来是建树成功的前提。3.2 第二步通过讨论确立候选质量属性清单在正式开始写场景之前先用一轮开放式讨论收集所有人的关注点。这一步我一般控制在半个到一个小时。让每个角色轮流说“这套系统如果明年只能做好三件非功能的事你希望是哪些”。注意不要让与会者直接给结论而是让他们描述现象和问题。比如“上周大促时首页接口在高峰期有超过5秒钟的等待”“每次发布新版本光回归测试就要跑一天”“数据库主库CPU在晚高峰已经持续超过80%”。每收集到一个现象就在白板上归到对应的质量属性下面。跑一轮下来基本就会形成一个覆盖绝大多数关注点的属性清单这时候再让全体一起看看是否漏了某些重要的领域比如安全合规这类平时没人提但可能一票否决的属性。3.3 第三步为高优先级属性生成具体场景接下来是最核心的一步把每个要重点关注的属性细化成场景。我会让每个参与方都提供一两个自己最担心的具体场景然后集体讨论、合并、去重最终每个属性下面保留三到八个有代表性的场景。这一步有一个技巧把场景写出来后一定要问一遍“如果这个场景发生时系统做不到会带来多大的业务损失”。如果答案是没什么损失这个场景的优先级就不该高如果损失很大不管技术上多难都应该出现在效用树的高优先级区域。3.4 第四步集体标注优先级并处理分歧这一步要做得认真。给每个叶子节点打优先级时我建议用“高/中/低”三级就够不要搞五级十级因为层级越多讨论越容易陷入细节。优先级不等于“系统现在做得好不好”而是“这个场景在整体价值中的重要性”。所以要基于业务影响来定而不是基于当前的技术表现。实际开会时优先级分歧几乎是必然的。业务方说可用性必须最高运维说可维护性优先安全说合规问题一票否决。这个阶段不要急于妥协。我把分歧都记录下来等全部场景打完优先级之后再单独针对“高”优先级数量是否过多做一轮收敛。如果“高”占比超过30%说明大家还没真正做出取舍需要逼着所有人再省一轮。3.5 第五步审查并把效用树挂到评估基线效用树初稿完成后我会把它放到评估的基线位置上补充上评估范围和限制条件。比如这次只评估核心交易链路或者这次评估不包括数据迁移方案。没有范围限定后面所有分析都会发散。这个基线就是后面所有评估结论的对标对象所以树本身必须被所有人认可。我习惯在当天会议结束前把最终的效用树与全部叶子节点清单投在屏幕上逐条过一遍确认大家没有异议再作为正式评估基线存档。4. 质量属性场景的撰写方法与指标设定4.1 场景六要素一个都不能少我写质量属性场景时用的是一套标准模板包含六个要素环境、刺激、刺激源、响应、响应度量、响应仲裁。环境是场景发生时的系统状态比如“正常低流量时段”“晚高峰80%峰值流量”“一个可用区不可用”。刺激是外部对这个系统发起的某个动作或事件比如“10万个并发用户同时发起下单请求”“数据库主库宕机”“一个恶意用户尝试批量登录”。刺激源是发起这个动作的角色或系统比如“来自移动端的普通用户”“运维监控平台检测到的主库故障”。响应是系统在刺激下应该做出的动作比如“下单请求在限定时间内成功返回”“系统自动切换到从库”“可疑请求被拦截并告警”。响应度量是这个响应的量化指标比如“99.9%的请求在1秒内返回”“故障恢复时间不超过5分钟”“拦截成功率100%”。第六个要素“响应仲裁”可能不常见但非常重要。它的意思是系统可以对多个并发刺激或请求进行优先级仲裁。比如在峰值时优先保证订单写入成功的响应而把数据仓库的同步延迟适当延后。把这个仲裁规则明确写进场景里后面的架构设计才能有针对性地做优先级控制。4.2 常见质量属性场景的参考模板我列几个在电商、SaaS、交易类系统里高频出现的场景模板可以直接套用。性能场景示例正常业务时段、CPU利用率稳定在30%以下的条件下10000个并发用户同时发起商品详情页查询系统应确保95%的请求在800毫秒内完成页面渲染且核心列表接口的吞吐量不低于每秒5000次。可用性场景示例在机房A发生网络分区故障时系统应能在30秒内将流量全部切到机房B整个切换过程对用户的可用性影响低于0.1%核心交易链路不出现超过2分钟的中断。安全性场景示例当攻击者从外部发起账号暴力破解时系统应能在连续5次密码错误后触发验证码与告警并在30分钟内自动封禁相关来源IP误封率不超过1%。可维护性场景示例当开发团队提交一个中等规模的功能变更时系统应允许开发人员在不改动其他模块的前提下完成上线单次发布的代码评审、构建、回归测试总耗时不超过4小时。可扩展性场景示例当业务请求量在三个月内翻倍时系统应支持通过水平扩展应用无状态节点和数据分片来线性提升吞吐量扩容过程的额外人工操作不超过1人日。4.3 指标怎么定才算既有挑战性又现实定指标是整个步骤里最容易起争议的地方。指标定得太高架构评估会变成永远不过的批斗会定得太低评估结果没有意义。我的做法是遵循“业务承诺 历史基线 技术可实现性”三角校准法。先找业务承诺比如业务方说下单接口的SLA是2秒内返回。再看历史基线上个季度实际P99延迟是1.4秒。最后结合技术判断在现有架构不改变的前提下能优化到1.2秒但到不了0.5秒。综合三个信息定一个“需要稍微努力但可证明可达成”的指标比如P99延迟1秒以内。这样的指标在后面评估架构时才有推导空间。现有架构要达到1秒需要解决哪些瓶颈新方案能达到多少两者差距是多少这就有说服力了。4.4 优先级排序与效用函数的关系这里我补一个稍微理论但很实用的点。效用树里每个叶子节点的优先级本质上是在刻画这个系统的“效用函数”。效用函数可以理解成系统在不同场景下提供价值的加权和。权重高的场景做得好整体效用就高。在做权衡的时候不同架构方案就是在不同的效用分配里做选择。比如方案A把性能优化到极致但可维护性一般方案B牺牲一点性能把可维护性和可扩展性做得很均衡。到底选A还是选B不能拍脑袋而是要看效用树里性能场景和可维护性场景的优先级分布。如果性能相关的叶子节点一大半都是高优先级A就有充分论据如果可维护性相关的高优先级更多B就更合适。这也是为什么我坚持效用树要先于方案讨论建好的原因。5. 从效用树到评估结论完整案例拆解5.1 案例背景一个在线教育平台的现状评估我用一个自己实际参与过的案例来做演示。某在线教育平台核心系统是一个单体PHP应用加MySQL主从随着业务从几千日活涨到几十万日活团队已经明显感觉到“有点撑不住了”。这次评估的主要目的是判断现有架构还能不能撑住未来一年的业务翻倍如果不行关键瓶颈在哪里应该往哪个方向演进。我组织了两天的评估工作坊。第一天上午建效用树下午做架构演示第二天上午验证场景下午形成结论和整改路线。效用树最终定出来高优先级叶子节点大概有九个中优先级十几个低优先级若干。我挑四个最具代表性的高优先级场景在下面说明。5.2 四个核心场景的评估过程第一个是高优先级性能场景核心交易链路选课支付在晚高峰并发增长300%的情况下P99延迟不超过2秒。针对这个场景做架构推演发现瓶颈非常清晰单体PHP应用的所有请求共用同一组进程池慢查询会占满数据库连接池进而拖垮所有接口。评估结论是现有架构在这个场景下不满足要求到了业务翻倍时必然超时。第二个是高优先级可用性场景数据库主库故障后核心业务中断不超过5分钟。现有架构的MySQL主从切换完全靠人工光识别故障加切换的过程按照历史经验要走四十多分钟远超5分钟的目标。这个场景同样不满足。第三个是高优先级可扩展性场景应用层支持通过加机器线性提升容量。这一点单体PHP反而是达标的因为应用节点可以水平扩展只要把会话外置、上传文件迁移到对象存储就行。结论是基本满足但有两个前置改造项一是把本地会话改成集中存储二是把本地文件迁移到对象存储。第四个是高优先级安全性场景用户敏感信息全链路加密存储。现有架构中用户手机号在数据库中是明文日志里也会偶发记录。结论是不满足需要安排数据脱敏改造。这四个场景一对比整个系统的短板非常直观地呈现出来了。效用树上的每一个叶子都对应一条“满足/不满足/部分满足”的评估结论整个评估报告的骨架就出来了。5.3 评估输出优先级矩阵与整改路线图两天评估下来最终输出不是一份长篇大论而是一个包含约20个场景的“质量属性场景评分表”和一个“整改路线图”。评分表里每个场景记录现状评估结论、差距分析、涉及模块、建议方案、优先级。整改路线图按时间分为三类。第一类是立即可做的低风险项比如把数据库慢查询治理起来把敏感信息加密补齐。第二类是中期改造项比如引入分库分表和缓存层。第三类是长期架构演进项比如逐步把单体核心链路拆出来做成独立的交易服务。这个案例如果想完整列出所有输出会很冗长但思路是完全可以复用的。效用树的每个高优先级叶子最后都要能落成一条整改建议或者一个明确的“维持现状”决策。如果叶子评估完没有任何行动项那这个叶子当初就不该以这么高的优先级出现在树里。6. 我踩过的那些坑以及给你避坑的几个经验6.1 典型问题速查表结合这些年做过的评估我整理了几个最常见的坑列在下面供你对照排查。坑具体表现后果应对方法效用树建得机械照抄标准属性清单完全没有基于业务定制评估发散跟业务脱节第一轮务必从各方的实际痛点出发场景写得空泛叶子节点写成“系统要高性能”而不是具体场景无法度量和讨论强制套用六要素模板写不出度量就走不了高优先级泛滥过半数场景都标高优先级等于没有优先级后续无法决策强制收敛说明取舍逻辑指标拍脑袋指标没有业务依据评估结论没说服力业务承诺加历史基线加技术可实现性三角校准只评估不整改报告写完就归档投入产出比为零每个高优先级叶子都要落成行动项6.2 几个实操中的叮嘱第一个叮嘱保持效用树是“活”的。很多团队评估完就把树扔了这非常可惜。每次大版本发布会改变业务假设都应回头检查一下效用树里的场景还有没有效。比如业务从单地区扩展成多地区可用性场景就得补充跨区域容灾用户规模增长一个量级性能场景的并发指标就要重新标定。让效用树跟着系统演进后面再做架构评估成本和准确度都会好很多。第二个叮嘱开会时控制讨论粒度。搭建效用树阶段要允许充分讨论但不能让讨论滑到“具体技术方案怎么选”上去。前者是目标层面的对齐后者是执行层面的选择混在一起会极大拖慢效率。我通常会在白板上画一条“当前不讨论技术实现细节”的提示线时刻提醒大家。第三个叮嘱如果条件允许让一位对系统业务非常熟悉的旁观者担任“挑战者”角色。他负责不断质疑场景的合理性和优先级比如“这个场景真的会发生吗”“这个指标业务方真的承诺过吗”。有挑战者的效用树明显比闭门造车的效用树扎实。第四个叮嘱评估会议结束当天把效用树电子化并让所有参会的利益相关方确认签字。这一步看似麻烦但能有效避免后续“这个优先级我当时没认过”的扯皮。一棵被全员认可的效用树是整个评估公信力的基础。6.3 关于工具用什么都可以工具层面不挑食。小团队用白板加手机拍照就足够最多再用Excel维护效用树和场景清单。团队分散一点的用在线协作白板、共享表格也能很好用。真正的重点不在工具而在于是否把效用树当成“讨论的共同语言”来用。我见过用文件夹加纯文本也能把评估做得非常扎实的团队也见过在高级工具上把效用树画得花哨但内容空泛的团队。所以别在工具上纠结时间花在场景质量上。我自己在实际操作中还有一个感受一场评估下来最见功力的不是最后推荐的“架构演进方案”而是前期这棵效用树建得好不好。树的质量直接决定评估是切中要害还是隔靴搔痒。这个工作没什么捷径可走就是要耐心地把利益相关方拉齐、把场景一个一个磨出来、把优先级一处处对齐。但这部分投入绝对值得因为它换来的是一份让所有人信服、能指导后续至少一到两年架构决策的评估基线。如果你正准备做一次架构评估建议从今天开始先别急着画目标架构图。召集相关方用半天时间把第一版效用树建起来。你会发现很多原本要架构师拍脑袋的难题在树建好的那一刻就已经有了初步的解法和讨论的共同语言。
返回列表