【面试】【5】如何取消超时未支付的订单?

1、数据库轮询

  使用一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后取消操作

  缺点:存在延时,最差的延迟时间是设置的扫描间隔时间;对数据库性能消耗极大

 

2、JDK延迟队列

  使用JDK自带的DelayQueue来实现,是一个无界阻塞队列,该队列只有在延时时间到了才能获取元素

  缺点:服务器重启后数据会全部消失,并且在下单未付款的定单数太多的情况下,很容易出现OOM异常

 

3、使用Redis的keyspace

  Notifications特性(2.8版本以上),可以在key失效后,提供一个回调,生成订单后把订单号座位key,按订单有效时间设置失效时间,当监听道键失效的时候就可以执行修改订单标记为过期

 

4、使用Redis的zset

  超时时间作为score,细节待补充。。。

 

5、使用消息队列

  使用RabbitMQ模拟延时队列的功能

  RabbitMQ具有两个特性可以实现延迟队列,RabbitMQ的queue可以设置x-dead-letter-exchange和x-dead-letter-routing-key两个参数,用来控制队列内出现了死信的时候,按照这两个参数重新路由

  优点:容易进行横向发展,消息支持持久化,增加了可靠性

  缺点:引入RabbitMQ,所以复杂程度变大

posted @ 2022-08-18 18:39  青玄0316  阅读(282)  评论(0编辑  收藏  举报