当前位置:首页 > 科研成果库

架构设计方法不是图册:约束、决策与演化边界的再审视

2026-10-26 05:46:21小研科研成果库6

架构评审室里最常见的画面:一张漂亮的部署图铺满投影,网关、服务、消息队列一应俱全。有人问,为什么这么分?回答是“业界都这样”。说实话,这种回答让评审会变成图册鉴赏。问题在这儿——图可以复制,约束不能。

架构设计方法的核心,不是把框画得整齐,而是把不确定性和约束逼到桌面上,形成可验证、可追责的决策。这个判断听着不玄。可落地时,很多团队还是把方法当模板:先套分层,再套微服务,最后补一张时序图。很顺。也很危险。

图不是架构,约束才是起点

一个系统为什么要拆成若干服务?讨论如果停在“高内聚低耦合”,基本等于没说。高内聚低耦合是目标,不是约束。真正起作用的约束通常更具体:订单创建和库存扣减是否允许最终一致;支付回调的幂等窗口有多长;团队有没有能力维护分布式事务;发布窗口是否被合规审计卡死。把这些写清楚,架构才有起点。

我习惯把约束分成四类:业务约束、技术约束、组织约束、合规约束。业务约束决定一致性边界和可用性目标;技术约束包括现有中间件、数据规模、网络分区;组织约束很现实,三个小组各管一摊,服务边界就很难按理想领域模型切;合规约束则经常被低估,日志留存、数据出境、审计追溯都会改变部署拓扑。少写一类,后面就多一次返工。

质量属性场景比形容词有用。不要说“系统要高可用”,而要写:大促峰值下,订单查询在 200ms 内返回的比例不低于 99%,失败时降级为只读缓存。这个场景会逼出缓存一致性、降级开关、容量冗余和监控指标。反过来,如果业务只是内部报表,日活几十人,硬上多活和全链路追踪,成本会吃掉收益。架构设计方法在这里不是求全,而是求匹配。

反例很常见。某团队先定了微服务,再补领域划分。结果订单、库存、优惠三个服务共享同一张表,事务靠定时任务补偿。图上看很现代,运行时很疼。问为什么拆,答“方便扩容”。可实际瓶颈在数据库连接池。约束没找准,方法就退化成装饰。

电商订单系统微服务依赖与事务边界示意图电商订单系统微服务依赖与事务边界示意图

这里的判断很直接:先写约束清单,再画候选结构。约束清单不必厚重,一页纸足够,但必须包含触发条件和反例。比如“若跨服务调用超过两次,则重新评估边界”。这比一张完美分层图更能防止架构漂移。

权衡要留下“为什么”,否则方法退化成仪式

架构决策记录(ADR)这几年被说得多,落地却常常走样。很多记录只写“采用 Kafka,因为高性能”。这等于没记。高性能是结果宣称,不是决策依据。有效的记录至少要留下:当时有哪些选项;哪些约束淘汰了其他选项;这个决定影响哪些模块;什么条件下应该重审。否则半年后新人只会看到一座既成事实,不知道哪里能改。

权衡不是把优缺点列成两栏就完事。真正难的是承认“这个决定在某些条件下会输”。比如为了解耦引入消息队列,代价是端到端延迟上升、重复消费需要幂等、排障链路变长。若业务要求强一致且调用链短,这个消息队列就是负资产。方法的价值在于提前写出这些代价,而不是事后解释。

我见过一种很要命的评审:所有决策都写成“经过充分讨论”。充分讨论不是证据。决策记录应围绕不可逆性和影响面分级。数据库选型、服务边界、同步调用改异步,这类决定值得写长一点;日志格式、内部工具选型,写一行就够。全都写重,团队会放弃维护;全都不写,架构就会变成口口相传的部落知识。

软件架构决策记录ADR模板与示例软件架构决策记录ADR模板与示例

话说回来,ADR 不是万能药。它只能记录显性决策,挡不住隐性耦合。两个服务通过共享数据库表“临时”连接,图上看不出来,代码里到处都是。要抓这种问题,得靠依赖分析、契约测试和发布前的影响面检查。文档和运行时证据要互相校验,否则记录越漂亮,偏差越隐蔽。

演化边界:哪些能换,哪些不能换

架构图通常画模块,我更关心边界。可替换边界、不可替换边界、以及替换成本随时间上升的边界,这三类信息比模块名更有用。比如支付渠道可以替换,但订单状态机一旦被下游大量依赖,改动成本会指数上升。把这类边界标出来,演进才有路线,不是拍脑袋重构。

演进式架构里有个实用手段:适应度函数。听着学术,落地可以很土。接口契约变更是否通过兼容性检查;核心链路 P99 是否超过预算;跨服务调用深度是否超过阈值;数据库迁移脚本是否可回滚。这些检查进入流水线,架构约束就不再只靠评审会喊话。条件也明确:指标要少,阈值要能解释,否则团队会绕过。

验证路径同样要写进方法。原型验证适合不确定的技术选型;故障注入适合验证降级和超时;容量压测适合暴露排队和连接池问题。别用一张静态图证明动态系统。系统在故障时的行为,才是架构的真实截面。

支付系统演进式架构适应度函数监控面板支付系统演进式架构适应度函数监控面板

趋势上,AI 辅助生成架构图会越来越常见。这里有个风险:生成图很快,约束和决策依据却可能被省略。图越顺滑,越容易掩盖未经验证的假设。我的态度是,把生成结果当候选方案,不当结论。让它帮忙列反例、查遗漏,可以;让它替代权衡记录,不行。

方法的应用边界与几个反例

小团队、需求高度不确定时,重型架构方法会压垮节奏。此时更合适的是轻量约束清单加短周期原型,先把关键风险打掉。强合规、长生命周期系统则相反,决策记录、审计追踪、变更影响分析不能省。方法没有普适强度,只有匹配度。

几个反例值得反复提。把 C4 图当架构本体,错了,图只是视图;把领域驱动设计当拆分万能钥匙,也错,领域模型需要业务专家持续投入;把微服务当组织问题解药,更错,服务边界不会自动修复沟通成本。还有一类隐蔽反例:抽象层过早。为了“未来可能替换”加了三层适配器,结果当前需求都跑不顺。边界要留,但不能留成迷宫。

所以,架构设计方法的产出不该只是一套图。它应该包含约束、候选结构、决策依据、验证证据和重审条件。少一样,方法就容易变成仪式。评审会上最该被追问的,不是框画得漂不漂亮,而是:这个决定在什么条件下会错?错了怎么退? 这两个问题答不上来,图再整齐,也只是图。