学习目标了解Java的DelayQueue原理 理解Redis实现延迟队列原理 理解RabbitMQ死信队列原理 能实现清理订单业务
1.业务需求之前我们讨论过扣减库存的问题,下单减库存和支付减库存各自有一定的优势和缺陷,我们选择了下单减库存的方案。 订单创建之后,就会扣减库存,并且生成了支付的二维码,但是如果用户一直不支付,就会导致商品库存被占用,而不能形成有效交易,会损害商家的利益,流失真正的具有购买意向的客户。 因此,如果有客户下单超过一定的时间没有付款,我们必须关闭订单,释放库存。
那么问题来了,我们如何得知哪些订单时超时未支付的订单呢?
订单下单后,需要等待一段时间后再判断是否支付,到底是关闭还是继续。这样的延时执行的业务,称为延时任务。
2.延迟队列与延时关闭订单这样的业务类似,还有很多需要延时执行的任务,例如: 订餐通知:下单成功后60s之后给用户发送短信通知。 当订单一直处于未支付状态时,如何及时的关闭订单,并退还库存? 如何定期检查处于退款状态的订单是否已经退款成功? 新创建店铺,N天内没有上传商品,系统如何知道该信息,并发送激活短信?
而解决这一类延时任务问题,一般都会通过延迟队列来解决 2.1.什么是延迟队列延迟队列,首先是队列,例如我们学习的MQ,是消息队列,也就是一个存放消息的容器。延迟队列就是延迟消费的消息队列。队列中存储的是延时消息,所谓“延时消息”是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费,(延迟送达)。 延迟队列不仅仅要实现消息的延迟消费,最好还要满足下面的几点要求:
|