大家好,我是老三,电商购物大家应该不陌生。我们应该注意到,下单后,通常会有一个倒计时。如超过支付时间,订单将自动取消。下单今天,我们就来说说自动取消逾期未付款订单的几种方案。1.定时任务这是最容易想到的。定时任务是轮询数据库,取消即将超时的订单。顺序轮询定时任务的实现方式有很多种,大致可以分为两类:本地定时任务和分布式定时任务。定时任务实现本地定时任务,适用于单机业务系统。实现方式有多种:永动机线程:开启一个线程,通过休眠完成计时。一些开源中间件的一些定时任务就是这样实现的。JDKTimer:JDK提供了TimerAPI,也提供了很多周期性的方法。延迟线程池:JDK也提供了一个延迟线程池ScheduledExecutorService,API类似于Timer。SpringTask:Sprig框架也提供了一些定时任务的实现,使用起来更方便。Quartz:Quartz框架更进一步,提供了一个动态可配置的线程池。分布式定时任务:适用于分布式业务系统,主要有两种实现框架:xxl-job:大众点评徐学礼开源,基于MySQL的轻量级分布式定时任务框架。elastic-job:当当网开发的弹性分布式任务调度系统,功能很强大,也比较重。定时任务实现的优点是开发起来比较简单,但也有一些缺点:对数据库的压力很大,定时任务造成人为的峰值,到时候数据库的压力会急剧增加的执行。计时不准确,计时任务不能很好的完成。精确的时间控制,比如半小时订单到期,但是定时任务很难满足这一点。2.被动取消文章开头的倒计时。你认为它是如何完成的?一般是客户端计时+服务端校验。这意味着什么?倒计时是由客户端完成的,但客户端会定期与服务器核对以更正倒计时时间。然后,订单超时自动取消也可以由客户端来完成:用户在收银台停留时,客户端倒计时+主动查询订单状态,服务器每次检查订单是否超时,剩余时间。进入与订单相关的页面。查询订单时,服务端还会检查订单是否超时被动取消。这种方法实现起来也比较简单,但也有缺点:依赖客户端。如果客户端不发起请求,则该订单可能永远无法获得。方法过期,一直占用库存。当然你也可以被动取消+定时任务,利用定时任务做自下而上的操作。3.延迟消息第三种选择是使用延迟消息。您可以使用来自RocketMQ、RabbitMQ和Kafka的延迟消息。消息发送后,经过一定的延迟后才会送达。这就是我们用于延迟消息的内容。消息队列使用RocketMQ。其实RocketMQ的延时也是通过使用定时任务来实现的。使用延迟消息的好处是效率更高,易于扩展。缺点是引入了新的技术组件,增加了复杂度。除了以上三种,其实还有一些其他的方法,比如本地延迟队列、时间轮算法、Redis过期监控……但是我觉得真的没有人会考虑在生产中使用这些方法。这里还有一个小问题要问你。如果我们连接了支付方式,支付周期很长,我们需要延长订单的有效期。这种情况下,如何实现超时未付款自动取消订单呢?参考文献:[1]。Java定时任务的6种实现,你知道几个?:https://juejin.cn/post/6992719702032121864[2]。订单超时未付款自动取消的8种实现方案:https://blog.csdn.net/Anenan/article/details/126368753:
