你的微服务拆分真的合理吗?这4条边界线多数人画错了
很多团队拆微服务拆完发现调用链更长了故障更多了发布反而更慢了。问题不在微服务本身而在边界画错了。下面这4条边界线是拆分时最容易踩坑的地方。一、业务能力边界不是按技术分层也不是按数据库表最常见的错误是按技术分层拆Controller一个服务、Service一个服务、DAO一个服务。这等于把单体应用的内部调用变成了网络调用性能暴跌还引入了分布式事务。另一种错误是按数据库表拆用户表一个服务、订单表一个服务、商品表一个服务。结果一个下单操作要跨三个服务每个服务只做CRUD业务逻辑碎了一地。正确的边界是业务能力。比如电商系统应该按“订单管理”“库存管理”“用户管理”“支付管理”来拆。每个服务封装一个完整的业务能力对外提供粗粒度接口。判断标准很简单如果两个功能总是一起变更、一起发布它们就不该被拆开。二、数据所有权边界每个服务独占数据库不能共享表很多团队拆了服务但数据库还是同一个服务A直接查服务B的表。这等于没拆——表结构一变两个服务一起挂。更隐蔽的是“共享库但不同表”看似隔离实际上外键约束、事务边界、连接池竞争依然存在。正确的做法是每个服务独占一个数据库只能通过API访问别人的数据。这意味着要放弃跨服务的JOIN改用接口组合或数据冗余。比如订单服务需要用户名可以在下单时把用户名冗余到订单表而不是每次去查用户服务。数据冗余带来一致性问题但这是分布式系统必须接受的权衡。三、团队组织边界康威定律不是让你按现有团队硬拆康威定律说“系统架构反映组织沟通结构”。很多管理者反过来用我们有三个组那就拆三个服务。结果一个组维护五个服务或者一个服务横跨三个组沟通成本爆炸。正确的边界是团队自治。一个服务应该由一个团队端到端负责包括开发、测试、部署、运维。服务边界和团队边界要对齐但前提是团队划分本身合理。如果两个组经常需要同步发布说明它们之间的服务边界画错了。反过来如果一个服务需要三个组协调才能改一行代码这个服务就该重新划分。亚马逊的“两个披萨团队”原则值得参考一个服务小到用一个披萨就能喂饱团队。四、事务与一致性边界强一致性事务内不能拆最终一致性边界外才拆这是最容易被忽视的一条。很多人把需要强一致性的操作拆到不同服务然后用分布式事务如Seata硬撑。结果系统复杂度飙升性能下降故障率反而更高。正确的边界是强一致性事务必须在一个服务内完成。比如“扣库存”和“创建订单”如果必须同时成功或失败它们就应该在同一个服务里。如果业务允许最终一致比如“下单后发短信通知”那就可以拆出去用消息队列异步处理。判断标准问业务方这个操作失败后能不能容忍短暂不一致不能就别拆。总结微服务拆分的本质是划定边界而不是追求“小”。边界画对了服务再大也是微服务边界画错了服务再小也是分布式单体。四条边界线记住按业务能力拆不按技术层数据独占不共享表团队自治不按现有组硬套强事务内聚最终一致才拆。最后提醒一句边界是演进而来的不是一开始就设计完美的。先粗后细让边界在业务压力下自然浮现比拍脑袋拆一堆服务靠谱得多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →