项目位置/技术/需求
在订单创建和库存处理环节,我们采用事务消息来满足跨服务处理最终一致的要求
解决的问题
该平台在用户下单时需要同时完成订单生成、库存占用和后续通知等工作,如果把这些操作全部放在一个同步事务中,系统会长时间等待库存处理和外部接口结果,活动高峰期吞吐量明显下降;如果完全不做一致性控制,又可能出现订单已经生成但库存没有占用的情况
解决的方法
为解决这一问题,我组织项目组将订单创建作为本地事务的核心边界,在 MySQL 中保存订单及其初始状态,同时通过 RocketMQ 发送订单创建消息,通知库存和消息等模块继续处理
具体的实现
具体运行时,用户提交订单后,订单模块先保证订单记录可靠落库,再发布后续处理消息;库存模块收到消息后完成库存占用,并记录处理结果
例子
以活动商品下单为例,即使库存处理短时间排队,订单记录和后续处理消息也能够保持对应关系
效果
通过事务消息,系统在不长时间阻塞用户请求的前提下,使订单和库存处理达到最终一致