文章目录

  • 业务背景
  • 分布式事务解决方案及缺点
  • 业务过程分析
  • 下单扣减库存的业务难点
  • 解决方案
    • 1. 先扣库存,后创建订单
  • 2. 先创建订单,后扣库存
  • 异常数据处理
    • 1. 库存表流水表
    • 2. 重试+回滚+报警+人工介入
  • 总结

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

业务背景

我们这里将业务简化为最简单的下单扣库存逻辑,不去关注其他分支部分来理解整个电商下单扣库存的解决方案

分布式事务解决方案及缺点

  • 最终一致性:异步解决方案,数据同步有延迟。性能高
  • TCC(try、Confirm、Cancel):同步解决方案,正常需要两个阶段(try、Confirm),对性能损耗较大
  • 事务状态表:同步方案,但需要每次记事务流水表、更新事务状态,比较繁琐和TCC类似,性能也有较大消耗
  • 异步对账:也是一个异步过程,需要后台定时器去对账补全数据

这里就不详细介绍每种解决方案的场景和使用了

业务过程分析

下单至少包含的两种操作:

  1. 创建订单
  2. 扣减库存

这里的订单和库存之间的调用故意画成双向的,客户端故意两个服务都调用,后面会具体分析

下单扣减库存的业务难点

  1. 需要同步执行,扣减库存的结果需要立即知道,否则会发生超卖违约
  2. 需要很高的性能

可以看到需要同步执行,又要高性能,所以TCC和事物状态表异步对账这几种方案就可以排除了。既要高性能又要强一致性,鱼和熊掌本就不可兼得。但是我们基于业务本身去分析,会发现有一个很关键的特点

不允许超卖,但是允许少卖,就是我们可以多扣库存不能少扣库存。比如100件商品我们可以买出99件,有1件没卖出去是可以接受的,但是如果100件商品卖给101人,其中有一个人收不到货就可能造成平台违规不能接受(具体业务场景具体分析,有些业务场景可能也能接受比如,故意超卖及时补货等,但这里就以上面说的不允许超卖为业务前提)。

解决方案

1. 先扣库存,后创建订单

会有如下三种情况发生

  1. 扣库存成功,创建订单成功。返回结果成功
  2. 扣库存成功,创建订单失败。返回结果失败。调用方重试(出现多扣减库存,多创建订单)
  3. 扣库存失败,不再创建订单。返回结果失败。调用方重试
情况 扣库存 创建订单 返回结果 影响
1 成功 成功 成功
2 成功 失败 失败 多扣库存、多创建订单
失败 失败

注意 扣库存和创建订单是不同的事务,不能放在通一个事务中,因为存在网络两将军问题

2. 先创建订单,后扣库存

也会有如下三种情况

  1. 创建订单成功,扣减库存成功,返回结果成功
  2. 创建订单成功,扣库存失败。调用方重试(可能出现多扣减库存)
  3. 创建订单失败,不再扣库存。返回结果失败。
情况 创建订单 扣库存 返回结果 影响
1 成功 成功 成功
2 成功 失败 失败 多扣库存,多创建订单
3 失败 失败

这里情况2为什扣库存失败了还会存在多扣库存的情况呢?因为这里的失败分两种,一种是库存系统真的扣库存失败,第二种就是库存扣成功了,可能因为网络原因导致订单系统认为扣失败了。详细情况可以了解网络两将军问题

先创建订单的方式可能出现订单创建成功,然后库存失败,导致创建了订单而库存未扣减。所以这种方案并不合适,除非将扣减库存和创建订单放在一个事务中,那又变成了先扣减库存,如果放在通一个事务。最坏的情况也是多扣减库存

异常数据处理

可以看到两种方案都会出现多扣减库存,那么如何处理这些异常数据呢?

1. 库存表流水表

  1. 在每次扣减库存的时候都去生成一条库存流水记录表,状态为占用,订单支付成功后,将状态改为释放
  2. 定时库存对账去扫描那些长时间状态为占用不释放的库存流水,根据订单状况看看是因为多扣的库存还是未支付的库存,然后将这些订单取消

2. 重试+回滚+报警+人工介入

上面的解决方案还是需要去维护一个多的库存流水表,然后去修改状态。如果需要更为简单使用的方案,就是通过重试+回滚+报警+人工介入。

基于方案 先扣库存,后创建订单。我们不作状态补偿,添加重试、报警、回滚、人工介入

具体流程

可以看到虽然最后还是要人工介入,但是很明显这种方案是很实用的。

不过这种方案在非常极端的情况可能存在回滚库存的时候系统宕机还是会多扣库存。其次在第一次扣库存存在多扣库存也无感知,肯定需要添加一个扣库存记录表(如果有MQ就先发一条延时消息),这里也就没画出来了,因为要注意细节太多了

可能上面的流程还涉及分布式锁等各种其他操作,这里就不重点展开了。因为主要是分析分布式事务的一种解决方案

如果想要更为稳妥的实现方案,可以基于消息中间件解决,比如RocketMQ的事务消息,具体实现方式可以参考这里

[分布式事务之可靠消息最终一致性RocketMQ实现落地]
https://blog.csdn.net/qq_42651904/article/details/121133057?spm=1001.2014.3001.5501

总结

总的来说分布式事务的解决方案有很多,每种解决方案都适用于不同的场景,大家在解决使用的时候还是需要结合业务来选择具体的解决方案,没有最好的方案,只有最适合的。
然后最重要的就是要记住所有的其他系统的调用都要有检查回滚操作

基于真实电商的下单扣库存学习理解分布式事务解决方案相关推荐

  1. Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

    Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在 ...

  2. 电商网站如何进行库存同步处理Redis+Lua

    电商网站库存模块 库存表包含了商品的sku,商品类型,商品款号,颜色,尺码,库存数,版本号,创建时间,修改时间. 商品类型,可根据商品分为,普通商品,赠品,内卖商品,预售商品等 库存表结构 @Data ...

  3. 浅析B2C电商产品中的“库存”概念

    电商产品最复杂的模块莫过于"后台模块",而后台模块中较为复杂的又莫过于"库存管理",而一般来讲B2C电商产品中的库存包括七大部分,分别是:可销售库存.订单占用库 ...

  4. 三年大型电商网站心得(减库存篇)

    回想自己本科毕业三年了,三年来,一直做的是电商项目,可是前两年都太忙了,一直进行简单的CRUD,反反复复,现在把项目中用到的一些设计思想和技术记录下来,今天要说的是---电商项目中减库存模块中的并发问 ...

  5. java毕业设计基于的电商平台的设计与实现Mybatis+系统+数据库+调试部署

    java毕业设计基于的电商平台的设计与实现Mybatis+系统+数据库+调试部署 java毕业设计基于的电商平台的设计与实现Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 ...

  6. 数据仓库电商建模_真实电商数据仓库全流程开发详解,资源教程下载

    课程名称 Hadoop大数据视频教程-第一季:真实电商数据仓库全流程开发详解(共46讲),资源教程下载 课程目录 第一部分:数据仓库基础理论与技术圈 第一章:互联网电商大数据环境 第二章:商业智能与数 ...

  7. 计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档)

    计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档) 计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档) 本源码技术栈: ...

  8. 基于JAVA基于的电商平台的设计与实现计算机毕业设计源码+系统+lw文档+部署

    基于JAVA基于的电商平台的设计与实现计算机毕业设计源码+系统+lw文档+部署 基于JAVA基于的电商平台的设计与实现计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开 ...

  9. 调用顺丰API实现电商专递下单和获取面单功能

    参考文章:https://www.cnblogs.com/zhangxiaoyong/p/8317229.html 顺丰需求文档: 链接:https://pan.baidu.com/s/16EEaph ...

最新文章

  1. java分布式锁解决方案 redisson or ZooKeeper
  2. SAP MB51物料凭证清单程序增强增加四个字段
  3. shell+中sum的用法_shell高级用法
  4. Linux学习笔记之一————什么是Linux及其应用领域
  5. Windows Server 2008密码重设盘
  6. react组件卸载调用的方法_React调用子组件方法与命令式编程误区
  7. SpringCache @Cacheable 在同一个类中调用方法,导致缓存不生效的问题及解决办法...
  8. 此流上不支持超时。_10分钟了解线程池,阿里再也不担心我线程池资源耗尽了...
  9. 鸿蒙系统会有彩蛋吗,华为新系统亮点不断,一个新功能让人欢呼,升级后还有惊喜彩蛋...
  10. Scratch 怪兽动画+骨骼矢量素材编程素材免费下载!
  11. 整理的一些java基础知识点,欢迎补充指正
  12. 蓝牙电话/耳机和蓝牙音乐profile
  13. 计算机基础——计算机网络
  14. 最新版的PDF转图片软件
  15. php科研项目申报审批系统
  16. 240. 搜索二维矩阵 II
  17. 【C语言】——C语言实现科赫雪花及科赫曲线
  18. 利用手动Ghost工具手动安装系统(U盘)
  19. 正交矩阵 Orthogonal Matrix
  20. 如何成为一颗 GitHub Star

热门文章

  1. Shell if 条件判断
  2. 极客Linux日记-2022年1月2日
  3. kafka消费组和分区关系详解
  4. 照片的35x45,300dpi怎么弄
  5. css+js实现自动伸缩导航栏
  6. 微信数据库最新的解密方式,使用C++代码解密微信加密数据库信息!
  7. 马化腾动怒!微信数据“被共享”,山寨微信团伙被判一年!
  8. [100天挑战100个前端效果]第十九天---人物介绍卡片效果(猜猜是哪三个大佬?)
  9. 《计算机网络》学习总结——数据链路层(完整理解)
  10. 如何永久关闭笔记本键盘