在跨服务场景下,分布式事务一致性保障是架构设计的核心挑战。本文分享一个实用的最终一致性解决方案。
问题场景:用户下单后需要同时调用库存服务扣减库存和订单服务创建订单,两个操作必须保证原子性。
解决方案:基于消息队列的最终一致性方案
-
核心思路:使用本地消息表 + 消息队列实现事务解耦
-
具体实现步骤:
- 订单服务创建订单记录,状态为"待处理"
- 调用库存服务扣减库存(异步)
- 库存服务扣减成功后,发送消息到MQ
- 消息消费者监听MQ,收到消息后更新订单状态为"已完成"
-
代码示例:
// 订单服务
@Transactional
public void createOrder(Order order) {
orderRepository.save(order);
// 调用库存服务
inventoryService.reduceStock(order.getProductId(), order.getQuantity());
// 本地消息表记录
MessageRecord record = new MessageRecord();
record.setOrderId(order.getId());
messageRepository.save(record);
}
// 消息消费者
@RabbitListener(queues = "order.queue")
public void handleOrderMessage(OrderMessage message) {
orderRepository.updateStatus(message.getOrderId(), "completed");
}
- 关键保障机制:
- 本地消息表确保消息发送的可靠性
- 消息重试机制避免网络异常
- 定时任务检查未完成的消息
该方案在保证数据一致性的同时,有效解耦了服务间的依赖关系。

讨论