处理超时订单(超时未付款)的解决方案
文章目录
- 1. 超时未支付订单处理
- 1.1 需求分析
- 1.2 实现思路
- 1.3 rabbitmq延迟消息
- 1.3.1 消息的TTL(Time To Live)
- 1.3.2 死信交换器 Dead Letter Exchanges
- 1.3.3 延迟消息处理
1. 超时未支付订单处理
1.1 需求分析
超过限定时间并未支付的订单,我们需要进行超时订单的处理:先调用微信支付api,查询该订单的支付状态。如果未支付调用关闭订单的api,并修改订单状态为已关闭,并回滚库存数。如果该订单已经支付,则做补偿操作(修改订单状态和记录)。
1.2 实现思路
实现步骤:
1.在生成订单时(表中记录订单的创建时间)
2.根据订单的创建时间到30分钟为准,如果订单没有支付
3.将订单生成消息放到死信队列
4.消费死信队列里面的消息: 删除数据库中未付款的订单, 需要去修改商品的库存
如何获取超过限定时间的订单?我们可以使用延迟消息队列(死信队列)来实现。
所谓延迟消息队列,就是消息的生产者发送的消息并不会立刻被消费,而是在设定的时间之后才可以消费。
我们可以在订单创建时发送一个延迟消息,消息为订单号,系统会在限定时间之后取出这个消息,然后查询订单的支付状态,根据结果做出相应的处理。
1.3 rabbitmq延迟消息
使用RabbitMQ来实现延迟消息必须先了解RabbitMQ的两个概念:消息的TTL和死信Exchange,通过这两者的组合来实现上述需求。
1.3.1 消息的TTL(Time To Live)
消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。
我们创建一个队列queue.temp,在Arguments 中添加x-message-ttl 为5000 (单位是毫秒),那每一个进入这个队列的消息在5秒后会消失。
1.3.2 死信交换器 Dead Letter Exchanges
一个消息在满足如下条件下,会进死信交换机,记住这里是交换机而不是队列,一个交换机可以对应很多队列。
(1) 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用。
(2)上面的消息的TTL到了,消息过期了。
(3)队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信交换机上。
Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没有两样。只是在某一个设置Dead Letter Exchange的队列中有消息过期了,会自动触发消息的转发,发送到Dead Letter Exchange中去。
我们现在可以测试一下延迟队列。
(1)创建死信交换器 exchange.ordertimeout (fanout)
(2)创建队列queue.ordertimeout
(3)建立死信交换器 exchange.ordertimeout 与队列queue.ordertimeout 之间的绑定
(4)创建队列queue.ordercreate,Arguments添加
x-message-ttl=10000
x-dead-letter-exchange: exchange.ordertimeout
(5)测试:向queue.ordercreate队列添加消息,等待10秒后消息从queue.ordercreate队列消失,
1.3.3 延迟消息处理
从消息队列queue.ordertimeout 中提取消息,执行订单删除
处理超时订单(超时未付款)的解决方案相关推荐
- java订单超时取消设计_quartz框架和关闭超时订单
Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运 ...
- quartz cron 每周一_quartz框架和关闭超时订单
Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运 ...
- 订单超时未支付的解决方案
订单超时未支付的解决方案 定时任务实现 被动取消 JDK的延迟队列 代码演示 时间轮算法 代码演示 Redis zset 实现延迟任务 代码演示 MQ 延时消息 代码演示 写在最后 在前面的文章 第三 ...
- 拼夕夕订单超时未支付自动关闭实现方案!
" 在开发中,往往会遇到一些关于延时任务的需求.例如:生成订单 30 分钟未支付,则自动取消:生成订单 60 秒后,给用户发短信. 对上述的任务,我们给一个专业的名字来形容,那就是延时任务. ...
- 订单超时未支付自动取消5种实现方案
大家好,我是宝哥! 前言 在开发中,往往会遇到一些关于延时任务的需求.比如最近大家都在忙抢回家的火车票,当你下了一个订单没有支付时,会有一个倒计时,提示你半小时之内支付,否则会自动取消.这样的场景是如 ...
- 订单超时未支付自动关闭的几种实现方案
做电商,就会遇到订单超时问题,而且还经常被拿来面试提问! 今天,周末放假,抽时间给大家总结了几种订单超时未支付自动关闭的实现方案.同时,我手机还有几套电商类从零架构到实现的视频教程,如有需要,可以加我 ...
- 订单超时未支付自动取消8种实现方案
定时轮询 数据库定时轮询方式,实现思路比较简单.启动一个定时任务,每隔一定时间扫描订单表,查询到超时订单就取消. 优点:实现简单. 缺点:轮询时间间隔不好确定,占用服务器资源,影响数据库性能. 惰性取 ...
- 订单超时处理方案介绍
在电商场景下,一个订单流程中有许多环节要用到超时处理,包括但不限于: 买家超时未付款:比如超过15分钟没有支付,订单自动取消. 商家超时未发货:比如商家超过1个月没发货,订单自动取消. 买家超时未收货 ...
- 延时任务处理订单超时方案(非定时)
在开发中,往往会遇到一些关于延时任务的需求.例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务.那么这里就会产生一个问题 ...
最新文章
- 13. 微型计算机中,传送cpu发出的读/写指令的总线是,我的微机原理题库
- aMCMC for Horseshoe: algorithms
- php反序列化java_PHP反序列化漏洞简介及相关技巧小结
- 刚刚,中国估值最高的AI公司一口气发布11款产品,横跨5大领域
- python前后台tcp/udp通讯示例
- Codeforces Round #374 (Div. 2) C. Journey DP
- oracle io错误的是什么意思,磁盘IO错误 导致数据库故障一则
- 清华大学杨殿阁 深度解读《汽车数据安全管理若干规定(征求意见稿)》
- JAVA游戏引擎!FXGL 教程 总目录
- Linux调整网卡MAC地址(指令)
- js【详解】arr.splice() 数组拼接
- Android错误日志分析
- CF1225D Power Products (数论)
- 刷脸支付开拓创走在时代的前沿
- Nim和anti-Nim
- 基于S3C6410WINCE6.0的LCD驱动详解
- debian armhf mysql_Debian for ARM
- python慕课测验答案_分母有理化12-1=______.
- Photoshop制作简洁清新的插画海报图片
- 学习ASP.NET的步骤
热门文章
- 济南申报高新技术企业不符合的条件
- CRM项目实战第一天
- 差异表达基因热图怎么看_获得差异表达基因后-基因功能注释
- Weex实战分享|Weex在极客时间APP中的实践
- 人与计算机进行交互的接口,5种新型人机交互技术
- 第一次使用Arduino MKR WIFI 1010
- [汇编题]将ax中的16位数分成四组,每组四位,分别放入al,bl,cl,dl中
- mysql查最高薪水,使用子查询查找MySQL Employee表的最高和第二最高薪水?
- iOS中 Realm的学习与使用 韩俊强的博客
- pytorch学习笔记(八):PytTorch可视化工具 visdom