性能、可用性、一致性、成本全都要?不可能——Awesome Architecture 质量属性取舍完整指南
【免费下载链接】awesome-architecture🧭 Architecture-first system design: 26 bilingual tutorials, 25 architecture templates, and 6 end-to-end cases covering distributed systems, AI-native systems, RAG, coding Agents, and production trade-offs.项目地址: https://gitcode.com/gh_mirrors/awesomearc/awesome-architecture
Awesome Architecture 是一个专注「架构」而非「代码」的开源知识库,收录 26 篇中英双语架构教程、25 个架构模板和 6 个端到端案例。这篇文章带你读懂其中最核心的一课:质量属性取舍——性能、可用性、一致性、成本为什么不可能全都要,以及架构师如何按业务排出优先级、清醒地做选择。
🎯一句话点题:功能决定系统能不能用,质量属性决定系统好不好用、扛不扛得住、值不值得。而架构的本质,就是按业务排好优先级,然后清醒地做取舍。
为什么质量属性才是架构的主战场?
新人盯着功能,架构师盯着质量属性。原因很简单:
- 功能性需求:系统要做什么(下单、搜索、发消息)——往往有标准答案,做出来都差不多;
- 非功能性需求 / 质量属性:系统要把这些事做得多好(多快、多稳、多省、多安全)——几乎全是取舍,没有标准答案,才真正考验判断力。
所以评估每一个属性,都要问三个问题:
- 怎么度量?说不出数字的目标都是空话;
- 怎么实现?常用哪些架构手段;
- 和谁冲突?它不是免费的,总会牺牲一些东西。
第三点是灵魂。本章最核心的真相是:这些属性互相打架,把任何一个拉满,几乎必然伤害另一个。
📖 完整讲解见 tutorial/06-质量属性与取舍.md,配套思考框架见 tutorial/02-架构师的思考框架.md。
四大核心属性:度量方法 + 实现手段 + 冲突对象
性能:看 P99 别看平均,感知延迟更重要
先分清两个常被混为一谈的指标:
- 延迟(Latency):单个请求从发出到拿到结果有多快;
- 吞吐(Throughput):单位时间能处理多少请求(QPS)。
这俩不是一回事,甚至常常对立——就像「限速 200 的单车道赛道」和「限速 80 的十车道高速」。
⚠️ 两个新手最容易踩的坑:
- 别只看平均延迟。平均 100ms 听着不错,但可能 99% 的人 50ms、1% 的人卡 5 秒——而那 1% 可能正是最重要的大客户。要看P95、P99 百分位,尾延迟才是体验杀手;
- 感知延迟常比真实延迟更重要。比如 AI 对话产品的流式输出:它没让总生成时间变短,但让用户 1 秒内就看到第一个字往外蹦,体验天差地别。
实现手段:缓存、读写分离、异步化、CDN、更好的索引与预计算。冲突对象:主要和成本冲突(更快往往要更多机器),也和一致性冲突(缓存与异步换来速度,代价是数据可能不那么新)。
可用性:几个 9 到底值多少钱?
可用性用「几个 9」度量,这串数字背后是冷冰冰的每年允许停机时长:
| 可用性 | 每年停机时间 | 每月停机时间 | 体感 |
|---|---|---|---|
| 99%(两个 9) | ≈ 3.65 天 | ≈ 7.2 小时 | 玩具 / 内部工具 |
| 99.9%(三个 9) | ≈ 8.76 小时 | ≈ 43 分钟 | 一般在线服务的及格线 |
| 99.99%(四个 9) | ≈ 52.6 分钟 | ≈ 4.3 分钟 | 严肃的商业服务 |
| 99.999%(五个 9) | ≈ 5.26 分钟 | ≈ 26 秒 | 电信 / 支付级,极其昂贵 |
💡每多一个 9,成本和复杂度往往是数量级地往上翻。从三个 9 到五个 9,不是再努力一点,而是几乎重做一遍架构、再砸几倍的钱。所以别张口就要五个 9——先问业务:这服务挂一小时,到底损失多少?
实现手段:核心思想就一个——消灭单点故障,用冗余兜底。
- 冗余:关键组件至少有备份,一个挂了另一个顶上;
- 故障域隔离:把鸡蛋放在不同篮子里(多机器、多机架、多可用区);
- 优雅降级:扛不住时宁可关掉次要功能、保住核心,比如大促时关掉「猜你喜欢」保住下单支付。
冲突对象:和成本冲突(冗余就是花钱养平时用不上的备份),和一致性冲突(多副本分区时很难保持强一致),也和简单性冲突。
一致性:强一致很贵,花在真出事的地方
在「强一致 ←→ 最终一致」这条谱系上,你的数据落在哪?
- 强一致:写入后所有读立刻看到最新值。代价是慢,协调不上还可能拒服务;
- 最终一致:各副本在一段时间内逐步同步,短暂窗口里读到的值可能不同。换来高可用和易扩展。
一个判断口诀(来自 tutorial/05-数据与状态.md):
- 必须强一致的(错了要赔钱 / 出事):钱、账户余额、库存、订单;
- 可以最终一致的(短暂不一致没人真的在意):点赞数、粉丝数、浏览动态、统计报表。
架构智慧:强一致很贵,别到处滥用。把宝贵的强一致配额花在真正会出事的地方;一个把点赞数也做成全网强一致的系统,是在为根本不需要的严谨支付高昂的性能和可用性代价。
冲突对象:它几乎和扩展性、可用性、性能都冲突。CAP 定理说死了:网络分区时,一致性和可用性二选一。这是架构里最根本、最绕不开的一组矛盾。
📋 更深的工程手段(Saga、Outbox、幂等、CQRS)见 tutorial/11-数据一致性工程.md 和 tutorial/10-分布式系统的硬道理.md。
成本:最常被忽视,却常常是真正的约束
成本是最常被工程师忽视的质量属性,但它常常是那个真正卡住你、不可逾越的约束。
新人画架构图时默认资源无限:多加几个缓存、多上几个副本、要五个 9……但现实是这些「更好」全都在烧钱。成本的三个反直觉之处:
- 它会偷偷复利:低效设计在 1 万用户时每月多花几百没人 care,到 1 亿用户时就是每月多烧几百万;
- 你为每个属性买的单,最后都记在成本这张账单上:冗余要钱、缓存要钱、多副本要钱、强一致要更强的机器、低延迟要更好的资源;
- 很多架构争论扒到最后,争的不是技术行不行,而是这点钱这点人值不值得这么干。
一个理论上完美、但把公司烧破产的架构,是失败的架构。
冲突网与不可能三角:为什么你不可能全都要
把各属性连起来,你会看到一张冲突网。几组经典冲突值得刻进脑子:
| # | 冲突对 | 一句话解释 |
|---|---|---|
| ① | 一致性 vs 可用性 | CAP:网络分区时鱼与熊掌不可兼得;钱/库存偏一致,点赞/动态流偏可用 |
| ② | 性能 vs 成本 | 要更快,几乎总要砸更多 / 更贵的资源 |
| ③ | 灵活/可扩展 vs 简单 | 微服务很灵活但复杂度爆炸;单体很简单但难独立扩展 |
| ④ | 安全 vs 便利/性能 | 每道防线都增加摩擦和开销 |
| ⑤ | 上线速度 vs 可维护性 | 赶工 = 借技术债,迟早连本带利还 |
最经典的直觉图,是一致性、可用性、低延迟构成的不可能三角——你很难同时把三个角都拉满:
- 想离一致性近,靠强一致和同步 → 往往牺牲可用性或延迟;
- 想离低延迟近,靠缓存和异步 → 往往牺牲一致性;
- 想离可用性近,靠多副本冗余 → 分区时往往得放弃强一致。
这张图不必当严格的数学定理,把它当直觉用:每次有人说「我全都要」,你就把这个三角摆出来,问一句——那你打算从哪个角往后退?
✅怎么破?答案永远是同一句:回到业务,排优先级。没有放之四海皆准的最优解,只有在这个业务、这个规模、这笔预算下更合理的那个解——没有最好的架构,只有最合适的架构。
和产品经理谈取舍:把技术翻译成钱、风险、时间
这是整章最实用、也最被工程师做错的一件事。你跑去说「我们应该上最终一致而不是强一致」,老板一脸茫然,然后凭感觉拍板——错的不是老板,是你。
取舍的优先级本就该由懂业务的人来定;你的职责是把技术选择翻译成他们听得懂的语言:钱、风险、上线时间。
翻译公式对比:
- ❌ 工程师说法:「这里用强一致会导致写吞吐下降,我们得加分片,还会牺牲可用性。」
- ✅ 业务后果:「方案 A(强一致):保证一分钱都不会错,但大促时可能要排队、每月多花 X 万;方案 B(最终一致):又快又便宜,但极端情况下余额可能几秒显示不准——这个我们能接受吗?」
几条沟通心法:
- 永远给选项 + 代价,而不是结论,让业务方在知情下选择;
- 用三种货币报价:钱、风险、时间——商业世界的通用语言;
- 把质量属性绑到业务指标上:别说「要四个 9」,要说「按我们的客单价,挂一小时损失 Y 万,所以值得投入 Z」;
- 明确区分底线和优化项:资金正确性是底线,延迟从 200ms 到 100ms 只是锦上添花——别把所有事都说得同样紧急,否则你会失去信誉。
一个好架构师,有一半的功夫在白板上,另一半在会议室里。
真实案例:在模板和案例里看取舍如何落地
理论要落地,得看真实系统。Awesome Architecture 的templates/和cases/里,每个系统都在末尾写明「关键决策与权衡」:
- 支付系统:「别的系统追求快,它首先追求『对』」——宁可慢、宁可拒绝一笔交易,也绝不能算错一分钱。正确性优先于可用性,这就是把钱相关的属性排到最高优先级的取舍。见 templates/payment-system/README.md
- 在线抢票系统:有限库存下的「支付后扣 / 下单扣 / 锁座预占」三种方案对比,每种都在可用性与一致性之间站在不同位置。完整推演见 cases/stararena-ticketing/README.md
- RAG 知识库、实时协同、内容分发、AI Agent:6 个端到端案例都按「起始架构为什么合理 → 哪个量化信号逼它升级 → 新架构选择了什么又放弃了什么」展开。总览见 cases/README.md
🗺️ 模板目录共 31 个真实系统架构地图,每个都覆盖高频取舍考点,见 templates/README.md。
新手学习路径:从这一章出发
如果你是初学者,建议按 tutorial/README.md 的路径走:
- 建立思维:01 为什么先有架构思维 → 02 架构师的思考框架 → 03 读懂与画好架构图
- 掌握工具箱:04 十大核心架构模式 → 05 数据与状态 →本章 06 质量属性与取舍
- 实战与演进:07 从 0 到 1 设计一个系统 → 08 架构决策记录与演进
- 进阶硬骨头:10–17 章覆盖分布式、韧性工程、规模化、组织即架构、安全与多租户、大模型时代判断
本章小结
- 质量属性几乎全是取舍——评估每个属性都问三件事:怎么度量、怎么实现、和谁冲突;
- 性能:看 P99 别看平均,感知延迟常比真实延迟更重要;
- 可用性:几个 9 对应每年停机多久,靠冗余 + 消灭单点实现,每多一个 9 成本数量级上涨;
- 一致性:强一致很贵,花在钱和库存等真出事的地方,其余用最终一致换可用和扩展;
- 成本:最常被忽视,却常常是真正的约束,你为每个属性买的单最后都记在这张账上;
- 破局之道:把技术选择翻译成钱、风险、上线时间,给选项 + 代价,让业务方在知情下决策。
代码告诉计算机要做什么;架构决定这件事到底值不值得做、能不能做成、扛不扛得住。而取舍能力,就是架构师最不可替代的资产。
【免费下载链接】awesome-architecture🧭 Architecture-first system design: 26 bilingual tutorials, 25 architecture templates, and 6 end-to-end cases covering distributed systems, AI-native systems, RAG, coding Agents, and production trade-offs.项目地址: https://gitcode.com/gh_mirrors/awesomearc/awesome-architecture
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考