# 《Seckill秒杀系统》第57章:异步化扣减商品库存流程设计

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★★☆☆
  • 本章重点:重点理解并掌握异步化扣减商品库存的流程设计,掌握订单微服务和商品微服务之间数据的交互设计,并能够灵活运用到自身实际项目中。

大家好,我是冰河~~

下单减库存看似非常简单的业务,但是在秒杀这种瞬时高并发流量场景下,如果设计不当,就可能会出现库存超卖或者少卖的情况。为了进一步提升秒杀系统的性能,扣减商品库存时,可以采用异步化设计。当用户提交订单后,可以向消息队列发送一条扣减商品库存的消息,由商品微服务监听扣减商品库存的消息,并异步扣减商品库存数量。

# 一、前言

对于秒杀系统来说,除了要保证数据的一致性以外,对于交易链路上的各个环节都要考虑到性能问题。尽量提升秒杀系统整体链路的性能,当用户下单时,扣减商品库存时,可以采用异步化设计,这样就能够提升用户下单核心链路的吞吐量和性能。

# 二、本章诉求

对秒杀系统的下单核心交易链路进行优化,在前面的文章中,我们对下单流程进行了异步化设计和编码实现,提高了下单流程的性能。对于下单减库存的业务来说,提交订单后,扣减商品库存的流程可以采用异步化设计,进一步提升核心交易链路的整体吞吐量和性能。

在基于可靠消息最终一致性分布式事务解决方案解决分布式事务问题时,本质上已经对下单扣减商品库存的逻辑进行了异步化设计。本章,就再次梳理下对下单扣减商品库存的异步化设计。

# 三、异步扣减商品库存设计

本节,我们就从正向事务流程消息和逆向事务流程消息两个方面对异步扣减商品库存的设计进行简单的说明。

# 3.1 正向事务消息流程设计

在前面的文章中,我们也已经介绍过,RocketMQ 4.3版本之后引入并实现了完整的事务消息机制,其内部实现了完整的本地消息表逻辑,使用RocketMQ实现可靠消息分布式事务就不用自己再实现本地消息表的逻辑了,极大地减轻了开发工作量。RocketMQ实现的事务消息我们在秒杀系统中,可以看成是正向的事务消息流程。

使用RocketMQ实现可靠消息分布式事务解决方案的原理和流程如图57-1所示。


整体流程如下所示。

1)事务发起方向RocketMQ发送Half消息。

2)RocketMQ向事务发起方响应Half消息发送成功。

3)事务发起方执行本地事务,向本地数据库中插入/更新/删除数据。

4)事务发起方向RocketMQ发送提交事务或者回滚事务的消息。

5)如果事务参与方未收到消息,或者执行事务失败,RocketMQ未删除保存的消息数据时,RocketMQ会回查事务发起方的接口,查询事务状态,以此确认是再次提交事务还是回滚事务。

6)事务发起方查询本地数据库,确认事务是否是执行成功的状态。

7)事务发起方根据查询出的事务状态,向RocketMQ发送提交事务或者回滚事务的消息。

8)如果第7步中事务发起方向RocketMQ发送的是提交事务的消息,则RocketMQ会向事务参与方投递消息。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码