0


处理超时订单(超时未付款)的解决方案

文章目录

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中去。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IL59uC3x-1644889547028)(images/10-6-1634236948865.png )]

我们现在可以测试一下延迟队列。

(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 中提取消息,执行订单删除

标签: rabbitmq java 中间件

本文转载自: https://blog.csdn.net/caozhisanguo/article/details/122936776
版权归原作者 小码哥的进阶 所有, 如有侵权,请联系我们删除。

“处理超时订单(超时未付款)的解决方案”的评论:

还没有评论