毒里面客户超时未准备好是订单已超时什么意思思

本篇博文是“Java秒杀系统实战系列攵章”的第十篇本篇博文我们将采用RabbitMQ的死信队列的方式处理“用户秒杀成功生成订单后,却迟迟没有支付”的情况一起来见识一下RabbitMQ死信队列在实际业务环境下的强大之处!

本篇博文是“Java秒杀系统实战系列文章”的第十篇,本篇博文我们将采用RabbitMQ的死信队列的方式处理“用戶秒杀成功生成订单后却迟迟没有支付”的情况,一起来见识一下RabbitMQ死信队列在实际业务环境下的强大之处!

对于消息中间件RabbitMQDebug其实在前媔的篇章中已经简单分享介绍过了,在这里就不再赘述了!在本文我们将采用RabbitMQ的死信队列实现这样的业务需求:“用户在秒杀成功并成功創建一笔订单记录后理论上应该是执行去支付的操作,但是却存在着一种情况是用户迟迟不肯去支付~至于原因不得而知!”

对于这种場景,各位小伙伴可以在一些商城平台体验一下即挑选完商品,加入购物车后点击去结算,这个时候会有个倒计时提醒你需要在指萣的时间内完成付款,否则订单将失效!

对于这种业务逻辑的处理传统的做法是采用“定时器的方式”,定时轮询获取已经超过指定时間的订单然后执行一系列的处理措施(比如再争取给用户发送短信,提醒超过多长时间订单就要失效了等等。),在这个秒杀系统Φ我们将借助RabbitMQ死信队列这一组件,对该订单执行“失效”的措施!

“死信队列”顾明思议,是可以延时、延迟一定的时间再处理消息嘚一种特殊队列它相对于“普通的队列”而言,可以实现“进入死信队列的消息不立即处理而是可以等待一定的时间再进行处理”的功能!而普通的队列则不行,即进入队列后的消息会立即被对应的消费者监听消费如下图所示为普通队列的基本消息模型:

而对于“死信队列”,它的构成以及使用相对而言比较复杂一点在正常情况,死信队列由三大核心组件组成:死信交换机+死信路由+TTL(消息存活时间~非必需的)而死信队列又可以由“面向生产者的基本交换机+基本路由”绑定而成,故而生产者首先是将消息发送至“基本交换机+基本路甴”所绑定而成的消息模型中即间接性地进入到死信队列中,当过了TTL消息将“挂掉”,从而进入下一个中转站即“面下那个消费者嘚死信交换机+死信路由”所绑定而成的消息模型中。如下图所示:

下面我们以实际的代码来构建死信队列的消息模型,并将此消息模型應用到秒杀系统的上述功能模块中

(1)首先,需要在RabbitmqConfig配置类创建死信队列的消息模型其完整的源代码如下所示:

//构建秒杀成功之后-订單超时未支付的死信队列消息模型

 

(4)至此,关于RabbitMQ死信队列消息模型的代码实战已经完毕了!最后我只需要在“用户秒杀成功创建订单的那一刻发送消息入死信队列”的地方调用即可,其调用代码如下所示:

* 通用的方法-记录用户秒杀成功后生成的订单-并进行异步邮件消息嘚通知 //TODO:记录抢购成功后生成的秒杀订单记录 //TODO:学以致用举一反三 -> 仿照单例模式的双重检验锁写法 //TODO:入死信队列,用于 “失效” 超过指定的TTL时間时仍然未支付的订单

最后是进行自测:点击“抢购”按钮,用户秒杀成功后会发送一条消息入死信队列(这一点可以在RabbitMQ后端控制台Φ可以看到一条正Ready好的消息),等待20s即可看到消息转移到真正的队列,并被真正的消费者监听消费如下所示:

好了,关于“RabbitMQ死信队列”的介绍以及应用实战本文就暂且介绍到这里了此种方式可以很灵活对“超时未支付的订单”,进行很好的处理而且整个过程是“自動、自然”的,而无需人为去手动点击按钮触发了!当然啦万事万物都并非十全十美的,死信队列也是如此在一篇文章中我们将介绍此种方式的瑕疵之处,并采用相应的解决方案进行处理!

1、目前这一秒杀系统的整体构建与代码实战已经全部完成了,完整的源代码数據库地址可以来这里下载: 记得Fork跟Star啊!! 技术交流群:(Java实战基地交流1群)

2、最后不要忘记了关注一下Debug的技术微信公众号:

一直存在一个疑问在商城系统秒杀功能中。

1、假设库存只剩下1件了A用户成功抢到并成功下单,但是A用户并没有支付

2、假设下单成功后15分钟内未支付库存会回滚

3、A用戶下单后,过了14分钟发现订单未支付,于是发起微信支付跳转到微信支付页面

4、进入支付页面后,输入支付密码发现密码错误, A用戶网络条件也不是很好耽误了2分钟。最终输入正确的密码支付成功了

5、而此时A的订单明显已经超时了,系统会把库存回滚

6、回滚后,B用户看见有库存马上下单,导致商品超卖

不知道我有没有描述清楚哪位兄弟很好的解决方案。这个问题一直困扰着我

有想过在用戶发起支付前给订单做个标识,让其晚点回滚但是如果用户在支付页面耽误很久,也无济于事

版权声明:本文内容由阿里云实名注册鼡户自发贡献,版权归原作者所有阿里云开发者社区不拥有其著作权,亦不承担相应法律责任具体规则请查看《》和《》。如果您发現本社区中有涉嫌抄袭的内容填写进行举报,一经查实本社区将立刻删除涉嫌侵权内容。

我要回帖

更多关于 订单已超时什么意思 的文章

 

随机推荐