下单扣库存场景下的分布式事务架构设计
1 概述
1.1 业务场景
用户下单同步扣减商品可售库存,涉及订单服务、库存服务两个微服务,跨服务数据更新存在分布式事务一致性问题,采用本地消息表(可靠消息最终一致性)方案实现分布式事务。
1.2 核心公式
可售库存 = 库存总数 - 冻结数
2 核心表结构设计
2.1 库存主表
维护商品基础库存数据,核心字段:
- 商品id
- 商家id
- 库存总数
- 冻结数
2.2 库存冻结流水表
记录每笔订单对应的库存冻结操作,用于幂等校验、事务状态追溯,唯一主键:订单id + 商品id
核心字段:
- 订单id
- 商品id
- 商品扣减数量
- 订单状态
2.3 订单服务本地消息表
用于存储待发送MQ消息,保障消息可靠投递,核心字段:
- 订单id
- MQ消息体:包含订单id、订单内商品id、对应扣减数量
- 消息状态:待发送、已发送未确认、消费成功、消费失败(库存扣减失败等)
- 重试次数
- 失败数据处理状态:待处理、已生成工单(工单由人工处理或系统自动处理)
字段状态释义
- 消费成功:库存服务完成可售库存扣减,回调订单服务更新本地消息表状态为「消费成功」
3 方案核心异常兜底保障(三大一致性机制)
本地事务强一致
订单创建、本地消息表插入操作在同一个数据库事务执行,保证订单数据与本地消息表数据强一致性,不会出现有订单无消息/有消息无订单的脏数据。MQ消息幂等防重复消费
MQ存在重发机制,会产生重复消息;库存冻结流水表以订单id+商品id作为唯一联合主键,重复消息会被唯一索引拦截,避免重复扣减库存。扣减失败兜底流程
订单创建成功