RabbtiMQ整合订单定时删除
最近在做校园二手商城,在支付功能时遇到这样一个问题:
正常支付逻辑: 生成订单 → 锁库存 → 支付 → 删除订单
如果我们在订单生成后没有支付,但是库存被锁了。因此我们需要定时检查如果订单超过30分钟没有支付的话,就自动删除订单并释放库存
那么该如何实现定时检测订单的功能呢?
第一个想法是通过定时任务,比如使用Quartz 每隔半个小时检查一下订单数据库,发现订单存活时间超过30分钟就删除订单,解锁库存,但这样有一个问题:我们都知道Quartz是以系统为单位计时的,不能精确到每个订单的个体,可能会浪费大量时,比如

黑色代表Quartz定时检查,红色代表有一个订单生成了,假如在30分钟的时候我们的Quartz定时检查了一次,31分钟的时候有一个订单生成,显然在60分钟的时候Quartz该订单还没过期,只能等待90分钟的时候发现该订单过期!对于一个购物系统来讲,商家的库存被多锁了29分钟!这是我们不能接受的事情。
所以我们可以使用RabbitMQ解决这个问题,主要利用了死信队列机制,我们可以设置一个过期时间,每次生成订单都向死信队列中发送一份,一旦订单过期了,死信队列就把他交给另一个队列,我们就叫业务队列,我们只需要监听业务队列,从中取出订单,删除订单解锁库存即可

代码如下:
@Configuration
public class MyMQConfig {
/**
* String name, boolean durable, boolean exclusive, boolean autoDelete, @Nullable Map<String, Object> arguments
*/
@Bean
public Queue orderDelayQueue(){
Map<String ,Object> arguments = new HashMap<>();
arguments.put("x-dead-letter-exchange", "order-event-exchange");
arguments.put("x-dead-letter-routing-key", "order.release.order");
arguments.put("x-message-ttl", 60000);
Queue queue = new Queue("order.delay.queue", true, false, false, arguments);
return queue;
}
@Bean
public Queue orderReleaseOrderQueue(){
Queue queue = new Queue("order.release.order.queue", true, false, false);
return queue;
}
/**
* String name, boolean durable, boolean autoDelete, Map<String, Object> arguments
* @return
*/
@Bean
public Exchange orderEventExchange(){
return new TopicExchange("order-event-exchange", true, false);
}
/**
* String destination, DestinationType destinationType, String exchange, String routingKey, @Nullable Map<String, Object> arguments
*/
@Bean
public Binding orderCreateOrderBinding(){
return new Binding("order.delay.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.create.order", null);
}
@Bean
public Binding orderReleaseOrderBinding(){
return new Binding("order.release.order.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.create.order", null);
}
}
接下来我们只需要生产者向order.delay.queue队列发送消息,消费者接受order.release.order.queue的消息即可
我有一壶酒
足以慰风尘
尽倾江海里
赠饮天下人

浙公网安备 33010602011771号