1. 引言
随着电商业务规模的不断扩大,传统的单体架构逐渐难以支撑高并发、海量数据和快速迭代的需求,越来越多的电商系统转向分布式架构。然而,分布式系统在带来弹性伸缩和高可用能力的同时,也引入了许多新的挑战。本文梳理分布式电商服务中常见的问题,并给出相应的解决思路。
2. 数据一致性问题
在分布式架构下,数据被拆分到多个服务、多个数据库中,跨服务的数据一致性成为最突出的问题之一。单体应用中,一次业务操作往往在一个数据库事务内完成,ACID 特性可以保证数据的强一致;而在分布式环境下,一次操作要跨越多个服务、多个数据库甚至多个数据中心,无法再依赖单一数据库事务,数据一致性问题的复杂度显著上升。
从一致性模型来看,主要分为强一致性和最终一致性两类。强一致性要求任何时刻所有节点都能读到最新写入的数据,通常通过 2PC、XA 等协议实现,但代价是性能开销大、可用性降低;最终一致性则允许系统在一段时间内存在中间状态,通过异步补偿、消息重试等手段最终达到一致,是分布式系统在性能和可用性之间的常见取舍。实际业务中,需要根据场景在两者之间权衡。
2.1 分布式事务
一次用户下单操作往往涉及订单服务、库存服务、支付服务和积分服务等多个节点,任何一个节点失败都可能导致数据不一致。常见的解决方案包括:
- 两阶段提交(2PC):强一致性方案,但性能开销大、协调者易成为单点瓶颈。注意,2PC 属于 XA 规范下的强一致性事务模型,而非 AT 模式。
- TCC(Try-Confirm-Cancel):通过业务补偿实现最终一致性,适合对一致性要求较高的场景。
- 本地消息表 + 消息队列:将事务操作与消息发送绑定,通过异步重试保证最终一致。该方案属于柔性事务,并非 XA 模式。
- Saga 模式:将长事务拆分为多个本地事务,失败时按逆序执行补偿操作。
2PC 虽然能提供强一致,但其同步阻塞、协调者单点和数据不一致窗口等问题在互联网高并发场景下往往难以接受,因此业界更倾向于采用 TCC、本地消息表、Saga 等柔性事务方案,以最终一致性换取更高的可用性和吞吐量。下面重点展开 TCC 的原理与实现细节。
2.1.3 TCC 原理详解
TCC 是一种基于业务补偿的柔性事务方案,将一次分布式事务拆分为 Try、Confirm、Cancel 三个阶段,分别对应资源预留、确认提交和补偿回滚。其核心思想是:在业务层面把「资源操作」拆成「预留」和「确认/取消」两步,从而在不依赖数据库全局锁的前提下实现最终一致性。
Try 阶段:尝试执行业务,完成资源预留。例如下单时先冻结库存、预占积分,此时业务尚未真正生效,但资源已被锁定,为后续操作做好准备。Try 阶段是三个阶段的入口,也是整个事务能否成功的关键。
Confirm 阶段:确认执行业务,将 Try 阶段预留的资源真正落地。例如把冻结的库存扣减、把预占的积分发放。Confirm 阶段要求幂等,因为网络重试可能导致重复调用,必须保证多次执行结果一致。
Cancel 阶段:取消执行业务,释放 Try 阶段预留的资源。例如把冻结的库存释放、把预占的积分退回。Cancel 阶段同样要求幂等,且必须能正确处理「Try 成功但 Confirm 失败」的中间状态。
三个阶段的执行由事务协调器统一调度:先对所有参与方执行 Try,全部成功后依次执行


1561

被折叠的 条评论
为什么被折叠?



