微服务架构中的分布式事务:Saga 模式实战
Lisa Tan | 2026-08-26T23:01:21 | Spring Boot, Cloud
通过电商下单场景,详解 Saga 编排模式和协调模式的实现差异,以及补偿事务的设计要点。
# 微服务架构中的分布式事务:Saga 模式实战 ## 问题 在微服务架构中,一个下单操作涉及订单服务、库存服务、支付服务、物流服务。传统的分布式事务(2PC)性能差且不适合微服务。 ## Saga 模式 将一个分布式事务拆分为多个本地事务,每个本地事务完成后发布事件,触发下一步。如果某步失败,执行补偿事务回滚。 ## 编排模式(Choreography) ``` 订单服务 --创建订单--> 库存服务 --扣减库存--> 支付服务 --扣款--> 完成 | | v v 库存不足 -> 取消订单 支付失败 -> 恢复库存 -> 取消订单 ``` ```java // 订单服务监听支付结果 @EventListener public void onPaymentCompleted(PaymentCompletedEvent event) { Order order = orderRepository.findById(event.getOrderId()); order.setStatus(OrderStatus.PAID); orderRepository.save(order); // 发布事件给物流服务 eventPublisher.publish(new OrderPaidEvent(order)); } // 补偿:支付失败时恢复库存 @EventListener public void onPaymentFailed(PaymentFailedEvent event) { inventoryService.restoreStock(event.getOrderId()); Order order = orderRepository.findById(event.getOrderId()); order.setStatus(OrderStatus.CANCELLED); orderRepository.save(order); } ``` ## 协调模式(Orchestration) 由一个 Saga 协调器统一管理流程: ```java public class OrderSagaOrchestrator { public void createOrder(OrderRequest request) { SagaBuilder.create() .step(orderService::create) .compensate(orderService::cancel) .step(inventoryService::reserve) .compensate(inventoryService::release) .step(paymentService::charge) .compensate(paymentService::refund) .step(shippingService::arrange) .compensate(shippingService::cancel) .execute(request); } } ``` ## 两种模式对比 | 维度 | 编排模式 | 协调模式 | |------|---------|---------| | 耦合度 | 低(事件驱动) | 中(集中管理) | | 可观测性 | 差(流程分散) | 好(集中监控) | | 复杂度 | 参与者多时难管理 | 协调器逻辑清晰 | ## 补偿事务设计原则 1. **幂等性**:补偿操作必须可重复执行 2. **可交换性**:Ti 和 Ci 的执行结果应等价于什么都没发生 3. **最终一致性**:允许中间状态短暂不一致