架构演进这个题目,我在不同场合聊过很多次,每次都能感受到大家对这个话题既熟悉又焦虑。熟悉是因为天天在谈,焦虑是因为演进背后的逻辑如果不清晰,很容易被各种概念带着跑。这篇内容我不打算做成时间线盘点,而是想结合这些年经手的项目,把架构演进过程中真正关键的那几个节点、取舍和踩坑记录捋一遍,既有方法论,也有能直接参考的实操细节。无论你现在维护的是单体系统、已经在拆微服务,还是正往云原生和AI应用架构过渡,这篇文章都能帮你找到自己在演进路径上的位置,以及下一步该往哪走。
1. 架构演进的整体脉络与驱动力
1.1 为什么架构一直在变
很多刚入行的朋友会问,架构为什么不能一次设计好,非要不停演进?这个问题背后其实是对架构本质的误解。架构不是画在纸上的蓝图,而是业务规模、团队结构、技术约束三方博弈下形成的动态平衡态。业务量涨了,团队人多了,技术栈换了,原来的平衡就会被打破,架构就必须跟着调整。
我用一个生活化的类比来解释:架构演进很像城市交通规划。一个小村庄,一条土路就够了,车再多也就是几辆拖拉机。发展到小镇,土路变柏油路,开始有红绿灯。到了大城市,光拓宽路面解决不了问题,得修高架、修地铁,甚至重新规划功能区。但你不可能在村庄阶段就建好一套完整的地铁网络,那是巨大的浪费,也是过度设计。架构演进的核心逻辑就是,在合适的时间做合适的事。
我早期做过一个传统企业的管理系统,当时就是一个标准的单体应用,一个WAR包部署在Tomcat里,Oracle数据库,内部员工几百人同时在线,性能完全没问题。那时候如果硬上微服务,引入一套完整的分布式基础设施,反而是灾难。反过来,后来做互联网电商类项目,日活量起来之后,单体架构的瓶颈会非常明显,就必须拆。所以判断架构是否需要演进,第一条标准永远是:当前的瓶颈到底在业务层面,还是在技术层面,还是在组织协作层面。
1.2 架构演进的核心驱动力拆解
我梳理这些年的项目经验,发现架构演进背后通常有四个驱动因素,它们相互叠加、交替出现。
第一个驱动因素是业务规模的增长。数据量、请求量、用户量的大幅上升,会让单体架构在数据库连接、应用内存、单点故障这些地方先撑不住。这时候演进的方向通常是水平和垂直拆分。
第二个驱动因素是团队规模的扩大。一个几百人的研发团队如果还维护一个代码仓库,光合并代码、协调发布就能耗尽所有精力。康威定律在这里体现得淋漓尽致——系统架构会慢慢趋向于复制组织的沟通结构。团队拆成几个小组,代码和系统自然也倾向拆成几个服务。
第三个驱动因素是技术栈的演进。Java从8到11到17,容器化从Docker到Kubernetes成为事实标准,云服务从IaaS到PaaS再到Serverless。技术底座变了,上层架构的实现方式也必须跟着变。比如以前自建机房,网络分区是稀缺资源,服务调用尽量走本地方法;上云之后,虚拟网络、负载均衡、对象存储都是开箱即用,架构设计空间就大不一样。
第四个驱动因素是业务形态的变化。最典型的就是移动互联网时代和现在的AI时代。移动端爆发让后端接口从面向页面变为面向API,才有了前后端分离和API网关的大规模普及。AI时代则带来了以LLM为核心的Agent架构,这种架构和传统的请求-响应模型完全不同,本质上是把"确定性逻辑"和"非确定性推理"做了新的分层。
2. 从单体架构到服务化拆分:第一步怎么走
2.1 单体架构的真正痛点
在聊拆分方案之前,得先把单体架构的痛点说透。很多人一提到单体就摇头,觉得那是落后的代名词,这是对单体最大的误解。单体架构在早期是最高效的方案,它的问题是随着系统长大逐渐暴露出来的,而不是它天生就错。
我习惯把单体架构的问题归纳为三类。第一类是资源竞争问题。所有模块共享同一个进程、同一套数据库连接池,当某个接口出现性能瓶颈,比如一个慢SQL,就可能拖垮整个应用。这就像老式公寓楼,水管是串联的,一户堵了,整栋楼都没水用。第二类是协作效率问题。代码都在一个仓库里,模块之间没有硬边界,改动很容易互相影响。实测下来,当代码量超过一定规模后,每次发布的回归测试成本会指数级上升。第三类是伸缩性问题。单体应用要么不扩,要扩就是整机扩容,无法针对热点模块做精准伸缩。但很多时候系统里只有一两个模块是高并发的,其他模块请求量很低,整体扩容的性价比很差。
2.2 水平拆分与垂直拆分的操作思路
明确了痛点之后,拆分的路径大体上是两条,一种是水平拆分,一种是垂直拆分,实际项目中通常是混合着来。
水平拆分指的是按照功能层次来切,典型的就是把展示层、业务逻辑层、数据访问层分离开,或者把读操作和写操作分离。比如早期电商系统,商品展示的读请求远远大于下单的写请求,就把读流量导到缓存和只读库,写流量走主库。这种拆分改动相对小,对团队结构的冲击也小,可以看作是架构演进的热身动作。
垂直拆分则是按照业务领域来切,比如把用户、订单、商品、库存拆成独立的服务。这个动作需要更谨慎,因为它涉及数据库的拆分,牵一发动全身。我在实际操作中的一个建议是,垂直拆分不能一上来就拆数据库,先拆应用层,一个业务域独立部署,但数据库暂时还共享,等接口层面稳定了,再逐步把表拆出去。这样可以把一次大手术分解成多次小手术,每次都有回退余地。
2.3 拆分的度与边界控制
拆分这件事,最难的不是技术,而是把握"度"。拆太粗,问题还在;拆太细,分布式事务、网络开销、运维复杂度会把你淹没。
我见过最夸张的一个项目,按照数据库表来拆服务,一个表一个微服务,最后服务数量到了上百个,但业务请求链路动辄跨越七八个服务,一次简单的查询要经过多次网络往返和分布式事务协调,性能比单体时代还差。这种教训说明,拆分必须以业务能力为边界,而不是以数据表为边界。一个用户服务可以包含用户信息、账户信息、地址信息这些相关表,因为它承载的是"用户"这个业务能力,而不是"用户表"这个数据实体。
另一个边界是数据一致性。能用最终一致性解决的问题,不要强行引入强一致分布式事务。比如下单扣库存这个经典场景,如果要求实时强一致,就得用分布式事务框架,复杂度非常高。但实际业务里,库存扣减允许短暂的超卖再回滚,最终保证一致就行。把一致性的要求降级,架构的复杂度会大幅下降。这一点在系统设计的时候就要想明白,而不是等拆完了再回头补。
3. 微服务架构的核心实践与陷阱
3.1 微服务带来的不只是技术解耦
微服务这几年被讲得太多了,反而容易让人忽略一个事实:微服务最大的价值不是技术上的解耦,而是组织上的自治。当团队规模到一定程度之后,微服务和团队结构是配套的。通常一个服务由一个跨职能的小团队负责,这个团队拥有从设计、开发、测试到部署的全部权限,不需要跨部门协调。
这也是为什么我经常提醒团队,如果你们只有十来个人,业务也处于早期验证阶段,不要轻易上微服务。微服务带来的分布式事务、链路追踪、配置管理、服务发现、网关治理这些问题,每一个都需要额外的人力去维护。在这个阶段,一个模块化的单体应用,配上一套清晰的代码规范,往往比微服务更高效。我甚至建议过一些团队,用模块化单体先跑两年,等业务验证了、团队扩大了,再按模块边界做渐进式拆分。这比一开始就铺开微服务要稳妥得多。
当然,如果决定上微服务,那么有几件事必须在一开始就做好。第一个是服务划分的明确边界,最好跟业务域一一对应。第二个是服务间通信协议的标准化,是走REST还是gRPC,要统一规定。第三个是基础设施的自动化,包括CI/CD流水线、监控告警、日志采集,这些不是等出了问题再补,而是从一开始就要搭好。
3.2 服务划分、通信与治理的关键决策
服务划分我前面提到了,要以业务能力为单位。这里补充一个实用的划分技巧:可以通过分析"变更频率"来辅助判断。比如订单状态流转和库存扣减,两者的变更频率和触发因素不同,放在一个服务里,任何一个的改动都要重新发布另一个的代码。如果拆开,独立的变更和发布就不会互相影响。这个方法虽然不是银弹,但在多数场景下能给出比较清晰的方向。
服务间通信是另一个容易翻车的地方。同步调用(HTTP/REST/gRPC)简单直接,但不适合长链路和突发流量,一个服务慢,整个链路都堵。异步消息(Kafka/RabbitMQ)能削峰填谷,但引入了消息可靠性和幂等消费的问题。我的经验是,核心交易链路尽量短,能异步就异步,异步解决不了的再考虑同步。同时要有一套完善的超时、重试、熔断机制,否则一个服务的抖动会像多米诺骨牌一样沿着调用链传导下去。这个在业界已经有成熟方案了,比如Sentinel、Resilience4j,选一个落地就行。
服务治理的关键点则在于可观测性。微服务拆开之后,一个请求会跨多个进程,没有一套完整的日志链路追踪,排查问题的效率会降到几乎为零。我之前在一个项目里吃过这个亏,服务拆分之后,线上一个问题需要靠人工去翻各个服务的日志拼接线索,一个普通问题排查了整整半天。后来统一接入了全链路追踪,每个请求带一个traceId,日志一搜就能看到完整调用链,效率提升了数倍。这个投入绝对值得。
3.3 分布式事务与定时任务的现实解法
分布式事务是微服务绕不开的话题。这里要泼一盆冷水:所有分布式事务方案都有代价,没有一个完美的银弹。两阶段提交XA协议,强一致,但性能差,协调者还可能成为新的单点。TCC(Try-Confirm-Cancel)性能好,但侵入性强,每个参与方都要实现三套逻辑。可靠消息最终一致性,是目前业务场景里用得最多的,因为它符合大多数业务对一致性的真实需求。
我想展开说一下可靠消息最终一致性的实现思路。以"下单后发优惠券"这个场景为例,订单服务在主事务里先写入本地消息表,然后通过MQ把事件发出去。优惠券服务消费消息,执行发券逻辑。关键在于消息发送方要保证"本地事务和消息发送"的原子性,常用的手段就是把消息内容作为业务数据的一部分,存在同一张表同一个事务里,再由一个定时任务把状态为"待发送"的消息扫描出来投递到MQ。消费方则要保证幂等,因为消息可能被重复消费。这个方案虽然代码多了一些,但胜在思路简单,不依赖特定的中间件,排查问题也直观。
微服务架构下的分布式定时任务也是一个高发问题区。单体时代的定时任务,一个进程里跑就行。拆了微服务之后,同一个定时任务如果部署了多个实例,就会重复执行,导致数据错乱。业界通用的解法是引入分布式调度框架,比如XXL-JOB或ElasticJob,通过分片或抢占锁机制保证同一个任务在同一时间只有一个实例执行。这里有一个容易被忽视的细节:任务执行结果要支持幂等写入,因为即使有调度框架,极端情况下仍然可能出现重复执行,比如网络分区导致抢占锁失效。只要写入操作是幂等的,重复执行的影响就能降到最低。
4. 基础设施演进:从自建到云原生架构
4.1 容器化与Kubernetes的落地价值
聊完应用层面的微服务,必须聊基础设施。因为微服务在物理机和虚拟机上跑和维护,成本非常吓人。几十个服务,各自依赖不同的环境,如果都用传统方式部署,光是环境一致性就能让你崩溃。容器化解决的就是这个问题:镜像把应用和它的运行环境一起打包,环境不一致的问题从根本上被消灭了。
在我经历的项目里,容器化推进过程中,Kubernetes成了事实上的编排标准。很多人被Kubernetes的学习曲线劝退,觉得它太复杂。我的看法是,Kubernetes确实复杂,但它的复杂度是"必要复杂度"。当你的微服务规模超过二三十个之后,用脚本和手工方式管理部署、扩缩容、滚动更新,复杂度反而更高。Kubernetes把这套大规模容器管理逻辑标准化了,你只需要学会它,而不是每次都为服务编排发明一套新的轮子。
不过Kubernetes的引入也是分阶段的。我建议先做"容器化",把所有应用打成镜像,用简单的容器编排工具管理起来,比如Docker Compose在单机场景下能覆盖很多需求。等确实需要跨多台机器、需要自动伸缩了,再上Kubernetes。直接从小单体跳到完整Kubernetes,对于没有容器化经验的团队来说,调试一个CrashLoopBackOff就能磨掉你一整天的耐心。
4.2 云原生架构的核心范式与收益
云原生这个词这几年已经有点被说滥了,但其中确实有几个核心范式是值得深入理解的。第一个是基础设施即代码(IaC),用Terraform这类工具把云资源定义成代码,环境可以重复创建、版本管理、代码评审。第二个是不可变基础设施,镜像一旦构建就不修改,任何变更都通过发布新版本完成。第三个是弹性伸缩,应用的容量设计不再按峰值预留资源,而是按实际负载动态伸缩。
我参与过一个典型的云原生改造项目,系统原先部署在自建机房,每逢大促需要提前两周申请服务器资源,采购流程走完,活动都结束了。后来迁到云上,应用全部容器化,配合弹性伸缩策略,促销前只需设定好伸缩规则,活动期间系统根据流量自动扩容机器,活动结束自动缩容。从资源利用率来看,整体成本下降了约30%到40%,最重要的是,人力从"盯服务器"中解放了出来,开始关注业务本身。
这里要提醒一句:云原生不是所有场景的万能药。如果你的业务非常稳定,请求量波动不大,上云和容器化带来的弹性红利就有限,反而要额外承受Kubernetes集群本身的运维成本。决策前想清楚自己的业务形态,比追技术热点重要得多。
4.3 国产化环境与多架构适配的实操记录
最近几年做一个项目时遇到一个非常现实的问题:目标运行环境是国产化的服务器和操作系统,CPU架构是ARM64,不是我们日常开发的x86。这个差异在开发环境毫无感知,到了生产部署阶段才暴露出来。
最典型的问题就是C++编译的本地依赖库不兼容。我们的服务里有一段图像处理模块,依赖了OpenCV的本地库,在x86下编译出的.so文件在ARM64环境上完全无法加载。解决方案有两个方向。一个是交叉编译,在x86的构建机上安装ARM64的交叉编译工具链,直接产出ARM64的二进制。另一个是在ARM64环境上本机构建,但构建机需要换成ARM架构的机器,或者用QEMU模拟。当时测试了多种方案,最终选择了在CI流水线里用QEMU提供的多架构构建能力,直接在Docker里构建出arm64镜像。这个路径能跑通,但构建速度比本机慢不少,CI流水线耗时比纯x86构建多了将近一倍。
这里涉及一个直观的检查方法:在Linux系统里查看系统架构,使用uname -m命令。如果是x86_64,就是64位x86架构;如果是aarch64,就是ARM64架构。判断当前Java或JDK是否支持对应架构,最简单的方法就是下载对应版本的JDK并执行java -version,正常情况下直接运行就会打印版本信息,如果出现Exec format error这类报错,说明二进制架构不匹配。另外,在运算能力上,x86架构通常采用CISC设计,ARM架构属于RISC设计,指令集不同,第三方库的预编译版本是否匹配操作系统和CPU架构,必须在选型阶段就纳入评估。这个在架构演进过程中特别容易被忽略,等部署阶段才炸出来,处理成本会翻倍。
5. 智能时代的新架构:Transformer与Agent
5.1 Transformer架构为何成为分水岭
聊完传统的服务端架构,必须把目光投向当前最热的方向:AI应用架构。而要理解AI应用架构,首先得理解Transformer架构为什么是分水岭。
Transformer架构最初是Google在2017年提出的,核心创新在于自注意力机制(Self-Attention)。在此之前,处理序列数据主要靠RNN和LSTM,它们的问题在于只能按顺序处理数据,无法有效并行,而且面对长序列时会丢失远距离的依赖关系。Transformer通过自注意力机制,让序列中的每一个元素都能直接与序列中的其他所有元素计算相关性,从原理上解决了这两个问题。这个机制可以简单理解成,你在读一句话的时候,不是从左到右逐字理解,而是同时关注句中所有词之间的关系来把握整体含义,注意力权重决定了哪些词对当前理解更重要。
实测下来,Transformer架构对AI领域的意义怎么强调都不过分。它让大规模预训练成为可能,也就是用海量文本数据训练一个超大的模型,然后针对具体任务做微调。这就是GPT系列模型的基础。后续的BERT、T5等都是在这个架构上演进出来的。可以这么说,没有Transformer,就不会有今天的大语言模型热潮。理解Transformer的基本原理,不只是为了面试,而是理解当前AI应用能力边界和局限性的前提。
指令集架构在这里也有一个对应关系值得展开。Transformer在训练和推理阶段需要大量的矩阵运算,这些运算对CPU和GPU的指令集提出了很高要求。以x86架构的AVX指令集和ARM架构的NEON指令集为例,它们都提供了单指令多数据(SIMD)的能力,可以在一个时钟周期内处理多个数据,显著加速矩阵乘法和卷积运算。市面上专为AI设计的加速芯片,比如NVIDIA的GPU、Google的TPU,本质上都是针对Transformer这类架构的算子做了高度优化的专用处理器。这也是为什么我们说,AI时代的架构演进不只是软件层的事情,硬件指令集架构同样在同步演进。
5.2 Agent架构与LLM应用的新范式
在Transformer大模型普及之后,应用层的架构也在发生变化。传统的后端架构里,一个请求进来,经过参数校验、业务逻辑处理、数据库读写,返回一个确定性的结果。而在LLM应用里,核心是"非确定性推理"——同样一个问题,模型每次生成的回答可能都不一样。这给架构设计带来了一个全新的挑战:如何把不确定的模型输出嵌入到确定性的业务系统里。
我的经验是,不要把大模型当成"数据库"或者"业务逻辑引擎"来用,而应该把它当成一个"推理规划器"。一个成熟的架构模式是:应用层负责与用户交互,LLM负责理解用户意图和生成回复,而真正需要精确计算的业务操作(比如查库存、生成订单、扣款)仍然由传统API完成,LLM只是决定"调用哪个API、以什么参数调用"。这种模式下,LLM是大脑,传统服务是手脚。这个和Agent架构的思想是完全一致的。
LangChain和LangGraph是当前实现Agent架构的主流框架。LangGraph在LangChain的基础上,把Agent的执行流程从"线性链"升级为"图结构",允许Agent在不同节点之间循环、分支和条件跳转。简单来说,LangGraph让Agent能够规划任务、执行工具调用、查看结果、调整策略,而不是机械地按固定流程走一遭。这个"思考-行动-观察"的循环,是Agent和传统程序最大的区别。我在实际项目中用LangGraph重构过一个客服问答系统,效果非常明显:以前用固定流程做意图识别和解答,遇到超出规则范围的用户问题就只能说"抱歉,我无法回答";改成Agent架构之后,系统可以自主搜索知识库、查订单状态、计算运费,再综合这些信息生成回答,交互体验完全不一样。
智能体开发案例里还有一个细节值得留意:Agent架构下,提示词不再是"写一次就完事"的静态文本,而是需要像代码一样被版本管理和测试。一个提示词的措辞变化,可能直接影响模型调用工具的成功率。实践中我会把提示词模板放到单独配置中心,用A/B测试的方式迭代优化,而不是混在业务代码里随手改。
5.3 架构师在AI时代的能力迁移方向
面对AI带来的架构变革,很多传统后端架构师会焦虑,觉得自己积累的分布式、微服务经验没用了。我的观点恰好相反:传统架构能力在AI时代不仅没有过时,反而变得更加重要。LLM应用再复杂,底层仍然需要数据库、消息队列、缓存、对象存储,这些都还是传统架构的范畴。AI架构师的核心竞争力,恰恰是把LLM这个"新组件"无缝接入已有系统的能力。
接下来的核心命题,是思考模型能力边界与业务需求的匹配度。哪些环节可以交给LLM,哪些环节必须用传统确定性代码,以及两者如何编排协作。这个判断力,没有传统的架构训练其实是很难具备的。另外,AI应用的可靠性、可观测性、安全合规同样是架构师的职责范畴。大模型的输出不可控,你需要设计防护机制来校验和约束模型的输出,该拦截的拦截,该降级的降级。这些能力,恰恰建立在多年架构演进实践中积累的系统思考功底之上。
我建议所有还在观望的架构师,尽快动手做一个LLM应用的小项目,不需要多复杂,哪怕是一个用LangChain接私有知识库做问答的小工具,把整个链路跑通,你就能理解"提示词、模型参数、上下文管理、工具调用"这些概念在实际系统里是怎么运作的。纸上得来终觉浅,这个领域尤其如此。
6. 架构演进中的常见问题排查与避坑经验
6.1 拆了微服务之后性能反而下降
这是我被问过最多的问题之一。拆了服务,性能反而变差了,是不是拆错了?这个问题的答案大概率不是"拆错了",而是"拆的方法有问题"。
最常见的原因是服务间调用过于频繁。原本在单体里一个本地方法调用就能完成的事,拆了之后变成了跨服务的网络调用,延迟从微秒级飙升到毫秒级。如果业务逻辑又比较啰嗦,一个请求内部要循环调用其他服务,性能直接雪崩。解决办法是优化调用链:能批量查询的不要循环查询,能合并接口的不要拆得太碎。如果实在无法避免跨服务调用,考虑引入缓存或者异步化,把热路径上的同步调用数量压下来。
另一个常见原因是分布式事务的滥用。有些团队为了保证数据一致性,大量使用同步的分布式事务方案,把原本很快的操作拖慢了几十倍。这里我还是建议优先使用最终一致性方案,把强一致性的应用场景限制在真正必要的少数核心链路上。
6.2 服务数量的增长带来的配置混乱
服务一多,配置管理就会出现问题。每个服务的数据库地址、缓存地址、消息队列地址分散在各个配置文件里,改一个环境配置要登录机器一个个改,既慢又容易出错。这个问题在早期微服务实践中非常普遍。
业界的主流解决思路是用配置中心统一管理,比如Nacos、Apollo或Spring Cloud Config。配置中心的好处是集中管理、动态刷新、权限控制。配置变了,应用不需要重启就能生效,这在排查线上问题时特别有用。我自己的习惯是,配置项本身也要区分环境,dev、test、prod要有独立的配置空间,同时敏感信息比如密码密钥,一定要用配置中心提供的加密能力或者外部密钥管理服务来保护,不能明文放在配置文件里。
6.3 多环境部署与版本兼容性容易踩的坑
架构演进过程中,版本兼容性问题非常容易在发布阶段爆发。典型的场景是:服务A的新版本依赖服务B的新接口,但发布顺序不对,先发布了A后发布了B,结果A调用B时发现接口不存在,直接报错。
规避这个问题的核心思路是保持兼容性设计。服务提供方在接口升级时,尽量采用增量演进的方式,新增字段或新接口,而不是修改或删除旧接口。如果确实无法兼容,就要引入版本号机制,比如在URL或请求头里带上版本信息,让新旧版本共存一段时间。在发布顺序上,要遵循先依赖方、后被依赖方的原则,也就是先升级底层服务,再升级上层服务。这个顺序虽然简单,但在实际团队的排期压力下经常被忽略,值得写成发布规范来约束。
这里还值得提一个和云平台相关的小细节:在使用OpenStack部署多架构虚拟机时,QEMU可以模拟不同的CPU架构。如果需要在x86宿主机上创建ARM的虚拟机,可以通过配置QEMU的CPU模型来实现,但性能会有明显损失。在测试场景下跑功能验证问题不大,但要量性能的话,尽量还是用真机。
6.4 实战排错速查表
| 症状 | 常见原因 | 优先排查手段 |
|---|---|---|
| 服务启动报Exec format error | 二进制与CPU架构不匹配 | 检查系统架构,确认JDK或应用包架构与运行环境一致 |
| 微服务调用超时频繁 | 服务间同步调用链路过长或代码未优化 | 查看链路追踪,定位慢节点,合并或拆分接口 |
| 定时任务重复执行 | 任务未做分布式锁或非幂等 | 引入分布式调度框架,确认写入幂等 |
| 配置修改不生效 | 配置未纳入配置中心或未做动态刷新 | 迁移到Nacos/Apollo,确认监听器生效 |
| 容器频繁重启 | 启动脚本参数错误或资源限制不足 | 查看容器日志,检查内存/CPU limit |
| 拆库后查询变慢 | 跨库Join被强行改成多次查询,查询次数膨胀 | 重设计数据访问层,引入宽表或聚合查询 |
写在最后的一点个人体会
架构演进这件事,越往后做,我越觉得它考验的压根不是技术视野,而是对业务、组织和成本的综合判断力。技术方案总有最优解,但结合真实团队的情况,最合适的才是最好的。这些年见过不少团队因为追逐热点,把架构搞得无比复杂,最后业务倒了,技术也没沉淀下来。反过来,也见过一些架构不那么"时髦"但高度匹配业务节奏的系统,走得非常稳健。
最后再分享一个小技巧:每次架构演进之后,无论结果好坏,我都会带着团队做一次复盘,把当初的决策依据、实际效果、与预期的偏差记录下来。半年后再回头看,这些记录比任何架构文档都珍贵。因为它回答的不仅是你做了什么,更是你做决策的那一刻,到底看到了什么、依据了什么。架构演进没有终点,但每一次演进的痕迹,都是团队成长最真实的刻度。