seckillVouchersMapper.save(seckillVouchers);
在订单生成时直接扣库存,这是最原始的扣库存方案,比较简单,但存在
问题
-
可能导致很多订单把产品库存扣除而未支付,这就需要有一个后台脚本,将一段时间内没有支付的订单的库存释放,把订单取消
-
即时扣库存,并发差
1、3步商品服务,操作商品服务的 db,2、4步订单服务,操作订单服务的 db。
避免访问不同服务的 db,原则上同一服务只能操作自身服务的 db。
首先考虑只将第4步异步。
分析
2,4都是操作db,第4步不再等待,1、2、3成功后立即反馈给用户。
之后通过消息通知服务异步下单,若第4步异步下单失败,重试操作,试图重新生成订单,MQ的消息也可回溯。
订单创建完成后,处于排队状态,然后服务发布一个事件Order Created
到消息队列中。
即订单服务向外界发送消息:我创建了一个订单,由MQ 转发给订阅该消息的服务。
如果商品服务收到创建订单消息之后执行扣库存操作。注意,这里可能因为某些不可抗因素导致扣库存失败,无论成功与否,商品服务都会发送一个扣库存消息到 MQ,消息内容即扣库存的结果。
订单服务会订阅扣库存的结果,接收到该消息后:
-
如果扣库存成功,将订单的状态改为
已确认
,即下单成功 -
如果扣库存失败,将订单的状态改为
已取消
,即下单失败
欲实现上述模型要求,需可靠的消息投递。服务发出的消息,一定会被MQ收到。
- 用户体验的变化
前端配合排队中等界面。
商品/订单服务都变成异步化,适合秒杀类场景,当流量不大时,并不太适合。
===================================================================
-
库存在Redis中保存
-
收到请求Redis判断是否库存充足 ,减掉Redis中库存
-
订单服务创建订单写入数据库,并发送消息
当订单支付成功后,会有一个出库过程,既然有这个过程,就有可能出库失败。
库存有两部分:
-
缓存redis层
-
数据库mysql层
-
当客服新增5个库存,则缓存redis和数据库mysql层都需增加5个库存,使用分布式事务的最终一致性来满足:库存要么全加,要么全不加。
-
当订单生成时,需要扣除库存,
先扣redis库存
,如果扣除成功,则生成订单进行支付,这个过程不扣除mysql库存
。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。
这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来
目录:
部分内容截图:
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**