连载中 1/20

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

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

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

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

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

微服务到底解决什么问题

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

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

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

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

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

三个信号与一条底线

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

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

下一篇:刀口怎么下

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

☕
503

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

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

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10101 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9873 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9294 阅读 · 21 评论 · 287 赞