为什么很多微服务系统,最后都在偷偷“合并”?
过去十年,微服务几乎成为了互联网架构的政治正确。
如果你在 2018 年左右参加架构面试,大概率会被问:
- 服务怎么拆?
- 怎么治理?
- 怎么做注册发现?
- 怎么做链路追踪?
那几年有一种特别强烈的氛围:
系统不拆微服务,好像就不够先进。
于是很多团队开始拆。
订单服务。
库存服务。
支付服务。
营销服务。
甚至有些团队:
一个业务拆十几个服务。
当时大家都觉得:
这是架构升级。
但有趣的是。
最近几年越来越多公司开始讨论:
- Modular Monolith
- Monorepo
- 合并服务
- 减少 RPC
甚至一些曾经疯狂拆分的团队,也开始悄悄把服务重新合回来。
为什么?
因为大家终于开始看见微服务真正的成本。
微服务最大的成本,从来不是性能
很多工程师第一次接触微服务的时候,会担心:
- RPC 慢
- 网络抖动
- 序列化开销
但这些通常不是最致命的问题。
一次 RPC 可能只是几毫秒。
真正昂贵的东西是:
认知成本。
系统拆开以后。
业务被切碎。
团队开始失去整体视角。
服务拆开之后,业务反而变复杂了
假设一个简单需求:
用户下单。
单体时代:
createOrder();
deductStock();
结束。
拆成微服务后:
OrderService
↓
InventoryService
↓
CouponService
↓
PaymentService
每一步都变成网络调用。
每一步都可能超时。
每一步都需要补偿。
于是原本几十行逻辑。
变成:
- 重试
- 熔断
- 降级
- 补偿
复杂度指数级上升。
很多团队拆出来的不是服务,而是 RPC 耦合
这是特别常见的问题。
服务按照数据库表拆:
- 订单服务
- 库存服务
- 支付服务
看起来边界清晰。
但半年之后:
每个需求都要同时修改多个服务。
这说明什么?
说明:
业务边界根本没拆开。
只是把原来的方法调用。
变成了远程调用。
耦合没有消失。
只是从 JVM 内部搬到了网络上。
真正的大厂为什么能玩微服务?
很多人看到:
阿里在拆。
字节在拆。
于是觉得:
微服务就是最佳实践。
但忽略了一个事实。
这些公司首先拆开的不是服务。
而是组织。
订单团队。
支付团队。
营销团队。
都是独立团队。
有自己的:
- 开发
- 测试
- 运维
服务边界其实来自组织边界。
而不是反过来。
很多团队的问题是:组织没拆,服务先拆了
于是出现一种特别尴尬的场景:
三个人维护十几个服务。
每次上线:
改一个需求。
要发五个服务。
最后:
业务没复杂。
运维先复杂了。
为什么 Modular Monolith 又开始流行?
因为大家终于意识到:
很多问题和部署方式无关。
真正的问题是:
- 领域边界混乱
- 模块职责不清
- 团队协作失控
这些问题:
拆服务解决不了。
于是很多团队开始回归一个思路:
先把边界做好。
再决定要不要拆服务。
这其实就是 Modular Monolith 的核心。
架构演进最容易犯的错误:过度设计
很多系统出问题。
不是因为架构太简单。
而是因为:
架构太复杂。
系统还没几万用户。
先上:
- 微服务
- Service Mesh
- CQRS
- Event Sourcing
结果:
业务还没复杂。
架构先复杂了。
团队大量时间花在:
修基础设施。
而不是解决业务问题。
微服务真正解决的是什么?
很多人以为:
微服务解决代码问题。
其实不是。
微服务解决的是:
组织规模问题。
当团队大到:
一个代码仓库已经无法协作。
一个发布周期已经无法承受。
这时候:
微服务才真正体现价值。
写在最后
过去几年最大的变化之一。
不是微服务失败了。
而是大家终于开始理性看待微服务。
微服务当然有价值。
但它不是银弹。
更不是技术先进的象征。
很多团队最后重新合并服务。
也不是因为技术倒退。
而是因为:
他们终于发现。
真正困难的从来不是怎么拆。
而是:
怎么控制复杂度。
而控制复杂度这件事。
远比选择单体还是微服务重要得多。
更多推荐
所有评论(0)