SpringBoot + 分布式锁 + 事务日志:跨服务操作原子性兜底方案
一、跨服务操作的那些坑,你踩过几个? 你是否有遇到过:用户在APP上兑换了一个价值1000积分的优惠券,系统扣了积分,但是优惠券没有发放成功。用户投诉到客服,客服查了半天,发现是中间某个服务调用失败了,导致整个流程中断。 更麻烦的是,因为是跨服务操作,数据不一致的问题很难定位和修复,最后只能手动给用户补发优惠券。 这样的场景,作为后端开发的你,是不是似曾相识? 二、为什么跨服务操作这么难? 在微服务架构下,一个业务流程往往需要多个服务协同完成: 订单服务创建订单 库存服务扣减库存 支付服务处理支付 物流服务安排发货 每个服务都是独立部署的,都有自己的数据库。当一个业务流程需要跨越多个服务时,原子性就成了一个大问题。 什么是原子性?简单来说,就是"要么全做,要么全不做"。 在单体应用中,我们可以使用数据库事务来保证原子性。但在微服务架构下,分布式事务的实现变得非常复杂。 三、分布式事务的困境 提到分布式事务,很多人会想到: 2PC(两阶段提交):性能差,容易阻塞 TCC(Try-Confirm-Cancel):实现复杂,需要业务侵入 Saga:长事务,状态管理复杂 本地消息表:依赖....