ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

架构经济学:架构决策的成本账与避坑指南

架构经济学:架构决策的成本账与避坑指南 1. 架构经济学到底在谈什么1.1 先给“成本”重新下个定义我估摸着凡是做过几年技术的人都经历过类似场景评审会上有人抛出“要不要引入消息队列”有人拿出性能数据说削峰填谷有人拿出社区活跃度说生态成熟最后技术负责人一句“先上后面再优化”就拍了板。散会之后总有人心里犯嘀咕——这事真的对吗我最近一直在琢磨一个问题琢磨多了就起了个名字叫“架构经济学”。所谓架构经济学不是说要把架构决策算成一张精确到分毫的财务报表而是把架构选择当成一种投资行为来看待每一次引入新技术、每一次拆分服务、每一次抽象设计都在消耗当下和未来的资源同时也在换取某种收益。你换到的可能是更快的迭代速度可能是更强的扩展能力也可能是更低的运维压力。问题是绝大多数团队只算得清收益算不清成本尤其算不清那些藏在后面的隐性成本。先说一个前提这里的“成本”远不止买服务器、付云厂商账单那种看得见的开销。它至少包含四类资金成本服务器、带宽、中间件许可、云资源、监控系统每个月都有实打实的账单。人力成本开发这套系统要多少人月维护要多少人月新同学上手要多久。时间成本架构改动导致的迭代变慢、排障时间拉长、重构周期膨胀。心智成本团队需要理解多少概念、记忆多少规则、应付多少例外——这部分几乎没人记账但它最致命。我见过不少团队架构演进本身没有错错的是只关注前两项对后两项视而不见。等到业务方开始抱怨“改个按钮要发版三天”“排查一个问题要横跨六个系统日志”的时候隐性成本爆发了。到那个节点再谈什么优雅、先进都显得苍白。所以这篇文章的立场很直白架构没有绝对的好坏只有能不能在你当前的约束条件下用可接受的成本换取可预期的收益。约束条件一变最优解就变。所谓“架构经济学”本质上是一门识别约束、核算成本、评估收益的学问。1.2 三个核心命题我把这些年做架构决策的体会压缩成三句话方便在评审会上快速对齐。第一句所有架构决策本质上都是经济决策。业务方说“我们要支持十万并发”技术方说“我们上微服务吧”这里面如果只谈技术不谈成本会议就会出现鸡同鸭讲的情况。技术人应该做的不是证明微服务能不能支撑十万并发而是回答为了支撑十万并发引入微服务的代价是什么有没有成本更低、同样能达成目标的方案这个“达成同样目标有没有更便宜的路径”的追问就是架构经济学思考的起点。第二句没有最优架构只有当前约束下的最适架构。“最优”这个词在架构语境里基本是个伪命题。你的团队规模、业务阶段、资金预算、时间窗口、历史包袱全都构成了约束条件。在初创期用一个聚合服务快速上线在增长期逐步拆分出独立的订单中心在成熟期引入完善的监控和容灾体系——这是同一条业务在不同约束下的合理路径谈不上哪一个更“先进”只谈哪一个更“匹配”。第三句架构演进的速度应该等于业务复杂度的增速外加一个小缓冲而不是技术想象力的上限。技术人最容易犯的毛病是因为技术能做到所以就要做。但业务还没复杂到那个程度时提前铺设的架构能力只会在银行里吃利息甚至倒贴保管费。上面说的“缓冲”意思是你可以让架构比当前业务复杂一点点留出半年的演进空间但不要留出五年的演进空间——那五年的杠杆往往是用当下的交付速度换来的。1.3 为什么架构决策总被低估前面提到“成本算不清”你可能觉得老生常谈。那我再补一刀为什么算不清因为架构决策的影响链太长了长到超出大多数人的耐心范围。一个技术选型的直接影响通常要等三到六个月才显现等到一两年后才完全显现。比如你在某个模块里引入了一份复杂的状态机框架当时觉得代码结构清晰半年后你会发现所有新需求都要在状态机里加分支所有排障都要先推演一遍状态流转新人上手周期从一周变成三周。这些成本不会出现在任何一期项目周报里但会一分不少地从团队的产出里扣除。更麻烦的是架构决策还带“不可逆性”。有些选择是可以回退的——比如把某个接口从HTTP改成gRPC改动范围可控但有些选择是不可逆的——比如把一个核心模块彻底拆散成多个独立部署的服务再想合回去成本往往比重写还高。判断哪些决策可逆、哪些不可逆远比判断“这个方案是否先进”重要。凡是不可逆的决策值得你多开三次评审会凡是可逆的决策可以大胆快速尝试。2. 架构决策的一本账显性成本与隐性成本2.1 写代码之前的真实账单我们用一个常见的例子来演算“架构的经济账”。假设某公司的交易系统需要一个“优惠券模块”最开始只是下单时校验并扣减用户拥有的券。第一个版本的实现最简单在用户表旁边加一张券表再在下单事务里扣减库存。后面业务膨胀优惠券要支持秒杀、满减、叠加、跨店分摊还要支持小程序端和后台运营端同时操作数据库行锁开始打架报表查询把主库拖慢了。这时候技术方案会上大概率出现一个声音“把优惠券拆成独立的微服务吧。”听起来顺理成章来算算账。拆服务前要做的事包括把券数据从主库迁出设计独立库表结构定义服务间接口协议处理下游系统对数据的所有直查依赖还要补齐分布式事务、缓存一致性、幂等方案以及新的监控告警和日志追踪。以一支五人后端团队为例保守估计要投入六到八人周。这六到八人周就是显性开发成本。但真正的开销在后面。拆完服务只要下游有任何一个系统通过“数据库直查”的方式读取券数据迁移就会陷入“边拆边补”的泥潭只要有一个接口调用没设计好超时和降级策略大促期间就会出现雪崩只要线上服务多了一个运维侧的部署链路、监控面板、权限申请就都跟着加一份。这些都属于隐性成本且看起来每个都微不足道积累起来却巨大。我并不是说不能拆而是说拆之前先把上面这些项目列全再判断值不值。至少我在实际复盘中发现90%的“拆”最后都变成了“早知道当时列个清单再拆”。2.2 隐性成本才是大头显性成本好算加了几台机器、写了多少行代码、排了多久期。隐性成本却是那种看不见、摸不着但每月准时扣款的“订阅费”。我列几个高频出现的隐性成本项你看看自己团队有没有。概念负担引入一种新框架团队就要学习它的核心概念。概念越多团队在讨论方案时越容易鸡同鸭讲。排障难度一个请求经过三个服务和一个消息队列出问题时查日志要跨越五个系统。相比之下单体应用一条调用链走完十分钟就能定位。发布节奏服务拆多了以后互相信赖的模块要协调发布顺序。原来一天发三次版本现在一个版本要等另外两个团队一起发。生态锁定选了某个框架后续招人、找资料、买组件都被钉在这个生态里。框架生态越冷门锁定的代价越高。注意隐性成本的可怕之处不在于它“高”而在于它“不在当期显现”。当期你看到的只是“一切顺利”半年后才发现“处处受限”。所以我养成了一个习惯拿新架构和旧架构做对比时不仅要列出新增能力的收益还要把“必须持续支付的隐性成本”单列一行写清每月的估算量级。哪怕是个大概数字也比假装不存在强。2.3 用“月成本”统一度量光列项还不够最好有一个统一度量单位否则评审会上又变成各说各话运维说资源快不够了业务说上线太慢了开发说代码不好写了。我自己的做法是用“月成本”来做归一化。公式很简单一笔架构投入的月成本 ≈ (一次性投入 / 摊销月数) 每月固定开销 每月变动开销。举几个具体例子成本类型举例月估算方式一次性开发服务拆分六人周6人周 1.5人月若按两年摊销约0.06人月/月固定运维新增K8s环境、监控、日志采集每月约0.5人天 0.025人月变动维护每个迭代都要适配接口变更约每月1人天 0.05人月心智负担新人上手多两周团队扩张时一次性出现难以平摊但必须记录把这些数字折算成“人月”后跟业务收益并列在一起看事情就清楚多了如果拆出优惠券服务能给这个模块带来每季度少两次故障、迭代速度提升30%的收益那笔账是划算的如果只是“架构更清晰了”这种虚词那对不起账面上是负数。当然我不建议真的搞一套精密的财务模型出来那就过犹不及了。估算到量级就够了目的是把模糊的“感觉值”变成可以争论的“计算值”。2.4 一个具体例子优惠券模块要不要拆接回上面那个场景我们直接把两个方案放在桌上对比一下。方案A继续在单体里演进。把券表单独拆库但不动服务接口还是本地调用只是把报表查询挪到只读从库把大促时的扣减改成带版本号的乐观锁。成本约三到四人周能支撑的规模大概是日订单量涨几十倍以内不需要改架构。方案B拆成独立优惠券服务。成本六到八人周迁移改造外加每月持续投入的接口维护、监控、联调成本。收益优惠券模块可以独立扩缩容与主站解耦可以做独立的故障隔离。在业务日订单量只有几万、增长曲线平稳的阶段方案A的投产比明显更高。到了日订单量百万级、大促时流量波峰五倍起、优惠券玩法每周更新的阶段方案A的行锁和本地调用就会成为瓶颈方案B的独立扩缩容才有价值。这个案例最能说明架构经济学的核心思维方案B不是“更好”的架构而是“更贵的架构”。它只有在业务规模带来的收益能够cover成本时才变成“更好的选择”。许多人踩坑就是因为在几万订单的阶段提前支付了百万订单架构的成本。3. 四个典型决策陷阱与避坑经验3.1 为想象中的规模买单先讲一个我见过很多次的场景。某业务刚上线团队十来个人日均请求量万级。一次技术评审上方案提出者拿出了一套基于K8s的微服务架构配上服务网格、独立配置中心、全链路追踪原因只有一句话“我们要为未来做准备。”问题是未来的业务规模并没有确切数字支撑。等一等你连未来一年的请求量预估都拿不出来怎么就能估算出这套架构能省多少钱更常见的真相是大多数业务在自认为“即将爆发”之后迎来的只是平稳增长。“为未来做准备”没有错错的是拿一个不确定的未来换来确定的当下的复杂度和交付成本。我给这类场景的建议是把“为未来做准备”翻译成具体指标——未来一年的日活预计多少、峰值QPS预计多少、团队规模预计翻几倍。把这些指标写下来之后再问自己当前架构在哪个指标附近会撑不住如果预估数字连当前架构上限的十分之一都不到那这笔投资大概率不划算。3.2 把“新”当成“好”技术圈有一个很隐蔽的陷阱新的框架、新的范式天然会产生吸引力让人误以为新就等于先进先进就应该采纳。于是有人仅仅因为“这技术很火”就把它引入生产环境完全没考虑团队基础、适用边界和替代成本。比如某团队本来用关系型数据库存消息表做得挺好后来看到“流处理”这个概念很热就想着引入流处理框架改造整个数据链路。结果改造到一半发现业务主要还是低延迟的在线查询和事务更新流处理框架不仅没带来收益反而引入了一套全新的部署体系和状态管理机制。这就是典型的“用新技术解决不存在的问题”。我的判断标准很简单一个新方案若要替代旧方案必须能在同样成本下解决旧方案解决不了的问题或者用更低的成本解决同等的问题。如果两个条件都不满足那不管这个新技术多“火”、多“优雅”都不应该进入生产环境。真感兴趣可以放在旁边试验项目里玩玩明白再上。3.3 只算建设成本不算运维成本这个陷阱藏得更深很多团队在技术选型时只关心“用多少人月能建起来”极少关心“建起来之后每个月要花多少人月养着”。举个例子。方案甲用云厂商托管的缓存服务一个月花费若干但部署三分钟完成扩缩容点按钮就行。方案乙自己在K8s里搭一套缓存集群节点挂了能自动拉起看着“节约”了托管费但需要团队有人维护它的版本升级、参数调优、故障处理还要为它设计监控告警。一年算下来方案乙的隐性人力开销很可能已经超过托管费。这背后的道理并不复杂任何系统的建设成本都是瞬时的运维成本却是持续到系统下线为止的。尤其不要忽视“无人愿意维护”的问题。技术圈常见的现象是一套系统上线时大家抢着做三年后成为遗留系统谁也不愿意碰。这套系统的运维成本并不会因为“没人愿意维护”而消失只会变成业务侧漫长的等待时间换一种方式继续支付。3.4 明星团队与丐版架构的错配另一个比较苦涩的陷阱是团队规模和技术复杂度的错配。有的团队确实厉害七八个人全是老兵能轻松驾驭微服务、容器编排、领域驱动设计那套体系上来就拆得很细。但是当团队发展到几十人新成员占比超过一半的时候同样一套架构就跑不动了——不是机器跑不动是“人”跑不动了。我曾见过一个大约三十人的团队维护着四十多个微服务每个服务规模很小但服务间关系极其复杂。每次新人入职光是把服务关系和调用链理清楚就要一个月。每次跨模块改动需要五个小组对齐方案联调成本高到惊人。后来不得不执行“反向合并”把若干服务重新合并成一个大的领域服务才把迭代速度救回来。这个案例说明了一个容易被忽略的经济规律架构复杂度与团队规模并不成正比它更像是抛物线——团队小但有足够高手时复杂度可以很高团队中等但新老比例失衡时中等复杂度已经够呛团队庞大且分工细密时复杂度必须重新收敛到“领域边界清晰、跨组协作极少”的程度。所以评审架构时不仅要问“这套架构能不能解决问题”还要问“我们这些人能不能长期养得住这套架构”。4. 一套务实可用的架构决策方法4.1 先明确需求、盘点约束、识别冲突聊了这么多“账本”和“陷阱”是时候给一套能落地的方法了。我的日常流程分五步第一步是明确需求、盘点约束、识别冲突。明确需求时我通常要求用一句话说清楚“我们要解决什么问题”并且不断追问“这个问题真实的触发条件是什么”。如果回答是“我感觉会出问题”“业界都这么做”那就还没想清楚。触发条件如果不是可观测、可量化的那么这个架构改造大概率是伪需求。盘点约束分四类时间约束多久必须上线、**人力约束谁能参与、什么水平、**资金约束预算多少、**合规约束有没有数据安全、审计等要求。把四类约束写下来再拿候选方案一一对照你往往自己就能发现冲突比如某方案需要六人周改造但上线时间只有三周这就是硬冲突必须换方案或调整范围。识别冲突的目的是提前把“注定无法两全”的事情摆到台面上而不是等实施到一半再拯救。识别不出来说明你对候选方案的理解还不够深先补功课再开会。4.2 量化可量化的标出不可量化的做完约束盘点进入量化阶段。这一步的输入是一张候选方案清单输出是一张“成本收益对比表”。我把表格分成三块可量化收益、可量化成本、不可量化因素。可量化收益包括性能提升比例、故障率下降、发布频率提高、扩容时间缩短可量化成本包括开发人天、增加资源费用、运维新增工时。不可量化因素另起一列写清楚是什么、谁受影响、影响方向是什么——比如“团队对新框架熟悉度不足初期效率低”“框架社区活跃度一般后续找资料可能困难”。这张表的价值不在于精确而在于把参与者认知对齐到同一个信息平面上。很多人争论到面红耳赤最后发现两个人连“这次改造的目标”都说得不一样。有了这张表至少能让讨论落在具体项上而不是情绪上。我个人的经验是如果做完这张表双方还是一边倒地支持同一个方案那可能没有把约束盘“全”。反过来如果做完这张表支持的、反对的都能拿出数据来讲道理这个评审会就算开成功了。4.3 对抗性评审唱反调是职责很多团队的技术评审会开成了“方案宣讲会”提方案的人讲PPT其余人点头或沉默最后负责人拍板。这种会议基本等于没开。我后来在团队内部立了一条规矩“每次评审必须安排一个人专门唱反调。”不是捣乱而是要求他从反面把方案掰开揉碎哪些前提站不住哪些收益被高估哪些成本被低估如果这个方案不做会怎样做了又能怎样唱反调的人可以从几个固定角度出发提高效率不做这个方案业务会出什么具体事故如果答不上来说明“必要性”存疑。做了这个方案半年后最可能出现的三个问题是什么提前暴露风险比事后补救便宜一百倍。有没有成本只有这个方案三分之一的替代方案哪怕能力弱一点跑过几轮对抗性评审之后团队养成了习惯方案提出者会主动把自己最大的疑虑先讲出来而不是等别人来挑刺。这既节省了评审时间也提高了方案的成熟度。4.4 用架构决策记录留下决策痕迹光在会上吵清楚了还不够还要留痕。我强烈建议团队用架构决策记录ADR来沉淀每一次关键决策。这份记录不要求长篇大论但必须包含五要素背景、决策、理由、后果、备选方案。分享一个我常用的ADR模板可以直接抄走# ADR-001优惠券模块暂不拆分独立服务 - 日期2024-06-15 - 状态已接受 ## 背景 当前日订单量约X万预计一年内可增长至Y倍。 优惠券与订单模块耦合在同一单体服务中存在行锁竞争。 ## 决策 暂不拆分独立服务。采用读写分离 乐观锁的方式扩容。 ## 理由 拆分需6~8人周开发并持续承担接口维护成本。 当前增长曲线下单体优化可支撑至百倍日订单量。 ## 后果 - 正面迭代效率不受影响人力可投入其他核心需求。 - 负面当达到单体上限时需要再支付一次拆分改造费用。 ## 备选方案 - 独立部署优惠券服务。 - 拆分但保留本地调用数据库分离服务不分离。有了ADR后面任何一个“当初为什么要这么设计”的追问都有据可查。很多团队不是没有做过深思熟虑的决策而是没有把深思熟虑的过程记录下来导致后来人翻旧账、老方案反复被推翻重来。4.5 延期决策与演进式架构最后给一个可能反直觉的观点一部分架构决策应该被主动延期。传统工程思维追求“一次做对”但这在面对快速变化的业务时是有代价的——你为“确定”付费但“确定”可能根本不存在。更好用的思路是做“可逆的近期决策”提前识别出哪些决策是可逆的然后大胆做可逆决策哪些决策是不可逆的才需要谨慎评审。这个概念再展开一点是这样的如果你预计未来三个月内就要面对某个规模节点那现在就值得花功夫准备如果你预计未来两三年才面对那个节点那现在最明智的方案往往是“用最普通的方式把它做对”也就是按当前业务规模选一个最廉价的可靠方案然后确保将来切换成本可控。“演进式架构”讲的就是这个意思架构不是一次性图纸而是随着你对问题域理解加深而不断调整的活物。很多人担心的“将来改架构要推倒重来”其实大多只需要局部演进关键是你别把“演进”的可能通道堵死。比如保持接口兼容性、保持模块边界清晰、保持数据模型容易迁移——这些是无论未来走哪条路都要做的“期权费”值得提前支付。5. 架构经济学的“大账”组织、文化与博弈5.1 康威定律架构是组织结构的影子前面聊的都是单个决策怎么算账但架构经济学还有一层更宏观的账组织的形状在很大程度上决定了系统的形状。这就是康威定律的通俗版本——设计系统的组织最终产出的系统结构会趋同于这个组织内部的沟通结构。一个团队按业务域划分系统就会长出清晰的领域边界一个团队按技术栈划分系统就会长出“前端组、后端组、数据组”式的技术分层。所以当我看到一个混乱的、依赖盘根错节的系统时我第一反应通常不是“代码写得烂”而是“组织沟通出了什么问题”。反过来要想得到一个好架构首先得把组织边界画对。这当中最需要小心的是“虚拟团队消失后留下的架构遗产”。很多公司搞项目制组建临时战队架构上临时加了通道。项目结束团队解散通道却永久保留在系统里成为后来所有复杂度的来源。这类问题比单纯的技术债更隐蔽因为它的产生跟代码无关跟“组织怎么运转”有关。5.2 架构评审里的“政治账”与“利益账”坦白说每个架构决策背后都有非技术因素。有人推动微服务化是因为“这是简历上好看的经历”有人反对上云是因为“团队对私有化部署更熟悉不想改变习惯”有人坚持引入新框架是因为“这框架是我选的不能打自己脸”。这些诉求未必是恶意的但它们客观存在而且经常左右最终结果。“架构经济学”要想落地必须承认这些“政治账”的存在而不是假装看不见。我自己处理这类问题的办法是把决策标准从“谁说得对”引导到“哪种方案在给定约束下对业务长期收益最大”。业务收益是相对客观的锚点当讨论回归到这个锚点上非技术因素就容易被暴露并边界化。如果一场评审会最终以“谁的级别高”收场说明这个组织的决策机制本身就出了问题跟方案好坏没关系了。给技术负责人一个额外建议遇到强烈推动某方案但你直觉上存疑的情况不要急着否定先请对方补三样东西——量化收益、量化成本、三套备选方案对比。补不出来再存疑补得出来哪怕直觉仍不认同你至少多了一个理性讨论的抓手。5.3 给技术负责人的三点实在建议说到最后我把自己这些年在架构评审桌上摔打出来的心得浓缩成三点建议送给正在承担技术决策责任的人。第一少谈“先进”多谈“匹配”。每次技术选型先明确约束条件再谈方案。“先进”是形容词“匹配”是动词只有动词才能指导行动。第二主动记录“不做的理由”。别只记录“做了什么、为什么做”也要记录“不做什么、为什么不”。很多架构方案不是真的最优只是评审会上没人反对而已。把“不做的理由”写清楚未来翻旧账时至少知道当初的边界条件是什么。第三为“改主意”留一扇门。既然是演进式架构就接受“今天的最优解可能不是明天的次优解”这件事。因此在做设计时凡是能留出的扩展点、兼容层、接口版本策略都值得做。这不是过度设计而是为不确定性支付的合理保险费。写在最后这篇文章写到这儿我心里其实很清楚架构经济学不是什么高深的理论也不是一套能算出标准答案的公式它更像是一种看问题的角度一份不断提醒自己“不要只谈技术、不谈成本”的自觉。我个人的切身体会是真正让我对架构决策产生敬畏的不是某一次技术方案的成败而是那些“当初拍板时觉得没什么半年后发现处处掣肘”的时刻。每一次这样的时刻都让我更坚定地回到那张成本收益表的原点逼着自己和团队把账算明白。如果你读完这篇文章只记住一件事我希望是这句话下次再有人抛出一个听起来很厉害的技术方案时先别急着问“能不能做到”先问“代价是什么换来什么值不值”。能做到这一点架构评审的质量就已经提升了一大半。最后分享一个我一直在用的小方法每次做完一个重大架构决策我都会在手机备忘录里留下一段录音用一两分钟描述当时的选择、理由和担忧。半年后回听一遍往往比自己想象的更能看清当时的盲区——这不贵但非常有用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进