本文以《凤凰架构》阅读笔记为阅读入口,结合《凤凰架构》当前公开在线文档重新组织。它不是章节摘要,而是我认为最值得带回日常项目的几条判断标准。

很多架构讨论很像技术产品展览:Kubernetes、Service Mesh、事件驱动、DDD、Serverless 都被摆在台面上,却没有先回答业务规模、团队结构和失败成本。

读《凤凰架构》后,我最强烈的感受是:架构的价值不在于“用了更先进的东西”,而在于让团队能够承受当前复杂度,并为下一次变化留下空间。

架构不是技术栈,而是一组约束下的选择

同一个方案放进不同团队,结论可能完全相反。

一个五人团队维护六七个强耦合服务,通常没有获得独立交付的收益,却要承担网络故障、接口兼容、分布式追踪、多仓库发布和数据一致性的成本。反过来,一个数百人共同修改同一单体、任何发布都要全员协调的系统,也可能已经超过单体边界能够承受的组织复杂度。

所以架构评审不应先问“要不要微服务”,而应先写清楚:

  • 一个需求通常会修改几个模块、由几个团队协作;
  • 模块能否独立测试、发布和回滚;
  • 数据所有权是否清晰;
  • 故障需要隔离到什么范围;
  • 团队是否具备监控、发布和故障处理能力;
  • 引入新边界后,沟通成本究竟下降还是上升。

工具只是答案的一部分,组织和业务约束才是问题本身。

微服务边界的核心是独立交付

微服务不是把 Controller 按名词拆成多个仓库,也不是一个数据库表对应一个服务。一个有意义的服务边界至少应具备三种性质:

  1. 内聚:一组高频共同变化的业务规则留在一起;
  2. 自治:服务可以独立开发、验证、发布和恢复;
  3. 可理解:团队能够说清它拥有的数据、能力和对外契约。

如果一次业务变更总要同时修改五个服务、开五个 PR、等待固定顺序发布,那么只是把单体内部调用变成了远程调用。代码目录看起来更“分布式”,实际交付仍然是一个整体。

拆分前可以先做一次变更耦合分析:统计最近三个月的需求和故障,看看哪些模块总是一起改、哪些团队总要一起发布。真实变更历史通常比一张理想领域图更能暴露边界。

基础设施下沉,但业务语义不能一起下沉

把通用能力交给数据库、容器平台或网关,能减少应用中的重复样板。例如:

  • 唯一约束交给数据库,避免并发下的 check-then-insert;
  • 服务发现、健康检查和滚动发布交给编排平台;
  • TLS 终止、基础鉴权和流量限制放到统一入口;
  • 日志、指标和追踪通过平台约定采集。

不过“基础设施下沉”不能理解为把所有正确性都交给平台。库存不能为负、订单只能支付一次、退款必须经过审批,这些是业务不变量,仍应在领域代码、事务和数据约束中明确表达。

判断一项能力该放在哪里,可以问三个问题:

  1. 它是否与具体业务语义无关;
  2. 平台实现是否比每个应用重复实现更可靠;
  3. 下沉后是否仍能被测试、观察和局部覆盖。

如果答案不清楚,先保留在应用边界内,等语义稳定后再平台化。过早下沉会把一次局部需求变成全平台升级。

演进不是持续加层,而是允许替换

系统会随着需求、人员和规模变化而老化,这并不证明最初设计失败。一个简单单体如果帮助产品验证了市场、让团队建立了领域认识,它已经完成了当前阶段的使命。

真正危险的是假设现有结构必须永远保留,于是每次变化只能继续加适配层、同步任务和例外配置。久而久之,所有人都知道结构不合理,却没人敢动。

演进式架构需要给每个阶段性方案写出退出条件:

当前方案解决什么问题:
可以承受的规模与团队边界:
已知限制:
需要持续观察的指标:
触发重新设计的条件:
数据和调用方怎样迁移:
失败时怎样回退:

例如“当前先使用单库”不是欠债声明。只要同时明确容量假设、热点指标、备份恢复和未来分区键候选,它就是一个有边界的工程决策。

大规模重写不是演进的默认方式

接受系统可替换,不等于轻易宣布全面重写。大爆炸式重写经常同时失去三样东西:旧系统里没写下来的业务规则、真实流量验证,以及随时回滚的能力。

更稳妥的迁移通常包含:

  • 先建立可观测基线,知道旧系统当前表现;
  • 在旧边界外建立新接口或防腐层;
  • 选择一条低风险、可独立验证的路径切流;
  • 新旧实现并行对比结果;
  • 小比例流量开始,保留快速回退;
  • 数据迁移有校验、补偿和最终完成条件;
  • 确认没有调用方后再删除旧路径。

演进的本质是控制变化风险,而不是让新旧两套系统永久共存。每一层兼容代码都应有负责人和删除日期。

复杂度像预算,不是越少越好

微服务、消息队列、缓存和容器平台都会引入复杂度,但它们也可能解决真实问题。关键不是追求“零复杂度”,而是判断新增复杂度是否买到了可量化收益。

可以把每次架构升级写成一份复杂度预算:

新增机制希望购买的收益新的失败模式谁负责
消息队列削峰、异步解耦重复、乱序、积压业务团队 + 平台
服务拆分独立发布、故障隔离网络、契约、分布式一致性服务所有者
Kubernetes标准化调度与发布集群、网络、权限复杂度平台团队

如果收益只是“看起来更现代”,而新的失败模式没人负责,这笔预算就不应批准。

读书笔记的价值在于暴露自己的未知

《凤凰架构》公开在线文档本身就是一个很好的示范:写作不是学习完成后的附属动作,而是检验理解的过程。

目录式摘抄只能证明“看过”。真正有用的读书输出至少要完成一次转换:

  • 把书中的概念换成自己项目里的例子;
  • 写出同意和不同意的部分;
  • 找一个过去的决策,用新框架重新评审;
  • 给出下次可以直接使用的检查表;
  • 标注结论依赖的前提,避免把阶段性经验写成定律。

当一段话无法脱离原书复述,往往说明它还没有进入自己的知识结构。

一份架构演进评审表

当前业务阶段和最重要目标:
团队数量、所有权和发布方式:
最频繁的变更路径:
当前最昂贵的故障模式:
准备引入的架构机制:
它购买的可量化收益:
它新增的失败模式和维护成本:
不改变架构还能怎样解决:
渐进迁移、验证和回滚方式:
重新评审与删除旧路径的条件:

如果一个方案无法回答这些问题,就还只是技术偏好,不是架构决策。

参考资料