连载中 1/20

单体还没撑不住?先搞清楚为什么拆微服务

2026-08-22 · 465 阅读 · 0 评论 · 0 赞

一次陪跑到凌晨两点的发版

周五晚上八点,运营提了个小需求:购物车的满减提示文案改两个字。老王估了半小时工作量,结果光等发布窗口就等了三天——购物车、订单、支付打包在同一个单体里,谁也不敢中途发版,统一挪到周五晚上动。上线之后全量回归,四个团队陪着改两个字的需求跑到了凌晨两点。

这不是个例。单体走到一定规模,会集体出现三个症状:发布互相卡——一个模块改动,全站回归;故障互相拖——一个模块内存泄漏,全站重启;协作互相等——几十个人改一个仓库,合并冲突天天有。三个症状指向同一个根源:部署边界和组织边界咬死了。

微服务到底解决什么问题

微服务的核心主张只有一句话:把一个部署单元拆成多个,让每个服务可以独立开发、独立测试、独立部署、独立扩容。它本质上是康威定律的工程化——按团队边界切系统边界,让每个小团队对自己那片服务从代码到运维全权负责。

它能换来四样东西:发布解耦,购物车一天发十次不影响支付;故障隔离,推荐服务挂了下单链路还能走;弹性扩容,大促只扩订单服务不扩全站;技术异构,新服务按需选型。注意,性能不在这个清单里——拆分之后多了网络与序列化开销,微服务不是性能方案,拆分前的性能问题拆完还在原地

拆早了的账单:分布式单体

微服务的账单同样真实:进程内的方法调用变成网络调用,多了延迟、超时、重试三件套;本地事务变成分布式事务;排障从看一个日志文件变成穿八个服务的链路。团队三个人、代码两万行就急着上微服务,大概率拆出分布式单体:服务之间同步调用绕成环,部署上拆开了,耦合上一分没少——运维复杂度翻了十倍,改个需求照样跨四个仓库。

// 分布式单体的典型调用图:任何需求都绕一圈
OrderService -> ProductService -> InventoryService -> OrderService   // 循环依赖
// 每条边都是一次网络调用:多一跳,就多一份超时、重试与排障成本

三个信号与一条底线

什么时候真的该拆?看三个信号:发布排队——发版窗口成为瓶颈,回归成本高到不敢发;团队规模——单个模块的维护人数超过两个披萨能喂饱的规模;扩容错位——只想扩订单,却得整体扩容。三个信号出现两个,拆分才开始划算;一个都没有,老老实实留在单体里。

还有一条底线:先在单体里把模块边界画清楚,再拆服务。用多模块、包结构和接口层把业务边界隔离好,将来拆分就是把模块搬出去;边界没画清楚就拆,只是把一团乱麻切成几团乱麻,还要额外付网络的税。

下一篇:刀口怎么下

决定拆只是开始,按什么粒度切、数据归谁、边界怎么验收,才真正决定后悔程度。下一篇从一张互相绕圈的调用图说起,讲讲限界上下文与服务拆分的刀法

503

10 年全栈工程师 · 503咖啡馆主理人

#微服务开篇#服务拆分#单体架构#分布式单体#架构演进

评论 (0)

相关推荐

连载中 12/20

排查四件套:jstack、jmap、jstat、jcmd 的实战分工

jstack 看线程在干什么,jmap 看堆里装了什么,jstat 看运行时在变什么,jcmd 是统一入口。四把刀各管一段,配合着用没有查不动的现场。

#jstack#jmap#jstat#jcmd#排查工具
2026-09-16 · 4 阅读 · 0 评论 · 0 赞
连载中 11/20

GC 日志:把回收过程翻译成人话

一行 GC 日志里塞着七种信息:谁触发的、收了哪、停了多久、活了哪些。加上 -Xlog 配置,再加上日志分析工具,GC 不再是只能盯监控曲线的黑盒。

#GC日志#Xlog#日志分析#GC监控#Full GC排查
2026-09-16 · 13 阅读 · 0 评论 · 0 赞
连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 8 阅读 · 0 评论 · 0 赞