您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

如何实现类似订单到期未支付自动关闭的功能?这6种方案任你挑选

时间:2022-11-24 17:45:24  来源:今日头条  作者:程序员拾山

我们在电商平台购物时,下单之后会有一个付款倒计时,如果在规定的时间内未付款,订单就会自动关闭。

类似这样的场景还有很多,比如优惠劵到期失效,下单后自动发消息等。

今天我们来讨论一下,要实现诸如此类的功能,都有哪些技术方案,这些方案的优缺点是什么。需要说明的是,以下这些方案每一种都有其适用场景,并无绝对优劣之分。

1,定时任务

通过定时任务关闭订单,是一种成本很低,实现也很容易的方案。通过简单的几行代码,写一个定时任务,定期扫描数据库中的订单,如果时间过期,就将其状态更新为关闭即可。


 

优点:实现容易,成本低,基本不依赖其他组件。

缺点:

 

  1. 时间可能不够精确。由于定时任务扫描的间隔是固定的,所以可能造成一些订单已经过期了一段时间才被扫描到,订单关闭的时间比正常时间晚一些。
  2. 增加了数据库的压力。随着订单的数量越来越多,扫描的成本也会越来越大,执行时间也会被拉长,可能导致某些应该被关闭的订单迟迟没有被关闭。

 

总结采用定时任务的方案比较适合对时间要求不是很敏感,并且数据量不太多的业务场景。

2,JDK延迟队列DelayQueue


 

DelayQueue是JDK提供的一个无界队列,我们可以看到,DelayQueue队列中的元素需要实现Delayed,它只提供了一个方法,就是获取过期时间。


 

用户的订单生成以后,设置过期时间比如30分钟,放入定义好的DelayQueue,然后创建一个线程,在线程中通过while(true)不断的从DelayQueue中获取过期的数据。

优点:不依赖任何第三方组件,连数据库也不需要了,实现起来也方便。

缺点:

 

  1. 因为DelayQueue是一个无界队列,如果放入的订单过多,会造成JVM OOM。
  2. DelayQueue基于JVM内存,如果JVM重启了,那所有数据就丢失了。

 

总结DelayQueue适用于数据量较小,且丢失也不影响主业务的场景,比如内部系统的一些非重要通知,就算丢失,也不会有太大影响。

3,redis过期监听

Redis是一个高性能的KV数据库,除了用作缓存以外,其实还提供了过期监听的功能。

在redis.conf中,配置notify-keyspace-events Ex即可开启此功能。

然后在代码中继承KeyspaceEventMessageListener,实现onMessage就可以监听过期的数据量。

public abstract class KeyspaceEventMessageListener implements MessageListener, InitializingBean, DisposableBean { private static final Topic TOPIC_ALL_KEYEVENTS = new PatternTopic("__keyevent@*"); //...省略部分代码 public void init() { if (StringUtils.hasText(keyspaceNotificationsConfigParameter)) { RedisConnection connection = listenerContAIner.getConnectionFactory().getConnection(); try { Properties config = connection.getConfig("notify-keyspace-events"); if (!StringUtils.hasText(config.getProperty("notify-keyspace-events"))) { connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter); } } finally { connection.close(); } } doRegister(listenerContainer); } protected void doRegister(RedisMessageListenerContainer container) { listenerContainer.addMessageListener(this, TOPIC_ALL_KEYEVENTS); } //...省略部分代码 @Override public void afterPropertiesSet() throws Exception { init(); } }

通过以上源码,我们可以发现,其本质也是注册一个listener,利用redis的发布订阅,当key过期时,发布过期消息(key)到Channel :__keyevent@*__:expired中。

在实际的业务中,我们可以将订单的过期时间设置比如30分钟,然后放入到redis。30分钟之后,就可以消费这个key,然后做一些业务上的后置动作,比如检查用户是否支付。

优点:由于redis的高性能,所以我们在设置key,或者消费key时,速度上是可以保证的。

缺点:由于redis的key过期策略原因,当一个key过期时,redis无法保证立刻将其删除,自然我们的监听事件也无法第一时间消费到这个key,所以会存在一定的延迟。另外,在redis5.0之前,订阅发布中的消息并没有被持久化,自然也没有所谓的确认机制。所以一旦消费消息的过程中我们的客户端发生了宕机,这条消息就彻底丢失了。

总结:redis的过期订阅相比于其他方案没有太大的优势,在实际生产环境中,用得相对较少。

4,Redisson分布式延迟队列RDelayedQueue

Redisson是一个基于redis实现的JAVA 驻内存数据网格,它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。

Redisson除了提供我们常用的分布式锁外,还提供了一个分布式延迟队列RDelayedQueue,他是一种基于zset结构实现的延迟队列,其实现类是RedissonDelayedQueue。


 

优点:使用简单,并且其实现类中大量使用lua脚本保证其原子性,不会有并发重复问题。

缺点:需要依赖redis(如果这算一种缺点的话)。

总结:Redisson是redis官方推荐的JAVA客户端,提供了很多常用的功能,使用简单、高效,推荐大家尝试使用。

5,RocketMQ延迟消息

延迟消息,当消息写入到Broker后,不会立刻被消费者消费,需要等待指定的时长后才可被消费处理的消息,称为延时消息。

 

在订单创建之后,我们就可以把订单作为一条消息投递到rocketmq,并将延迟时间设置为30分钟,这样,30分钟后我们定义的consumer就可以消费到这条消息,然后检查用户是否支付了这个订单。

通过延迟消息,我们就可以将业务解耦,极大地简化我们的代码逻辑。

优点:可以使代码逻辑清晰,系统之间完全解耦,只需关注生产及消费消息即可。另外其吞吐量极高,最多可以支撑万亿级的数据量。

缺点:相对来说mq是重量级的组件,引入mq之后,随之而来的消息丢失、幂等性问题等都加深了系统的复杂度。

总结:通过mq进行系统业务解耦,以及对系统性能削峰填谷已经是当前高性能系统的标配。

6,RabbitMQ死信队列

除了RocketMQ的延迟队列,RabbitMQ的死信队列也可以实现消息延迟功能。

当RabbitMQ中的一条正常消息,因为过了存活时间(TTL过期)、队列长度超限、被消费者拒绝等原因无法被消费时,就会被当成一条死信消息,投递到死信队列。

基于这样的机制,我们可以给消息设置一个ttl,然后故意不消费消息,等消息过期就会进入死信队列,我们再消费死信队列即可。

通过这样的方式,就可以达到同RocketMQ延迟消息一样的效果。

优点:同RocketMQ一样,RabbitMQ同样可以使业务解耦,基于其集群的扩展性,也可以实现高可用、高性能的目标

缺点:死信队列本质还是一个队列,队列都是先进先出,如果队头的消息过期时间比较长,就会导致后面过期的消息无法得到及时消费,造成消息阻塞。

总结:除了增加系统复杂度之外,死信队列的阻塞问题也是需要我们重点关注的。

最后

本文介绍了常见的6种实现订单关闭的方案,不同的方案都有其适用的场景,各自的优缺点也不尽相同,大家可以根据自己的业务场景,选择合适的方案。

如果本文中没有提到你熟悉的技术方案,也欢迎在评论区分享给大家,期待共同学习进步。

写文不易,朋友们帮忙点点赞和关注吧,谢谢。



Tags:订单   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
网约车抽成“套路”多:订单倒卖、高速费抽佣 如何保障司机收入?
今年是刘先生在广州开网约车的第四年。他每天上午10点开工,晚上11点左右收工,日均上线时长约12小时,日均流水500多块钱,每月休息两天。除去租车、充电的成本,“每天能赚200多至30...【详细内容】
2024-04-09  Search: 订单  点击:(9)  评论:(0)  加入收藏
网约车抽成“套路”多:订单倒卖、高速费抽佣,如何保障司机收入?
今年是刘先生在广州开网约车的第四年。他每天上午10点开工,晚上11点左右收工,日均上线时长约12小时,日均流水500多块钱,每月休息两天。除去租车、充电的成本,“每天能赚200多至30...【详细内容】
2024-04-08  Search: 订单  点击:(5)  评论:(0)  加入收藏
女生搬家叫来7.6米长大货车,货拉拉:发现车大可取消订单
3月6日,一段关于“搬家叫来7.6米长半挂”的短视频在网上引发热议。视频中,一辆7米6长的厢式大货车缓缓行驶,一位女生跟着货车旁,似乎很无奈。视频配文:“跟闺蜜搬家,闺蜜叫了个货...【详细内容】
2024-03-07  Search: 订单  点击:(17)  评论:(0)  加入收藏
网约车平台怎么选,订单最多的网约车平台
随着互联网的发展,网约车平台已经成为人们出行的一种重要方式。但是,面对众多的网约车平台,很多人都不清楚该如何选择,以及哪个平台的订单最多。本文将为你解答这些问题,让你在选...【详细内容】
2023-12-21  Search: 订单  点击:(130)  评论:(0)  加入收藏
Spring Boot中实现订单30分钟自动取消的策略思路及源代码
方式一:使用定时任务 首先,创建一个定时任务,比如每30分钟执行一次检查订单是否需要取消的逻辑。 在订单生成的时候,保存一条记录到数据库,标记订单的状态为"待处理"。 在定时任...【详细内容】
2023-11-20  Search: 订单  点击:(221)  评论:(0)  加入收藏
国庆假期返程火车票今日开抢:短途票更难抢?候补订单哪儿来?
国庆假期最后一天(10月6日)返程火车票今日开抢!经历了今年中秋国庆假期“世纪抢票大战”后,有网友近期在社交平台留言称,“开始提前焦虑怎么抢回程票了”。同时,也有不少网友再现...【详细内容】
2023-09-22  Search: 订单  点击:(93)  评论:(0)  加入收藏
订单同比增30倍,600多万人参与,研学游是智商税吗?|钛度图闻
钛度图闻·第一百零七期策划制作|钛媒体视觉中心,编辑|刘亚宁,作图|初彦墨在北京、西安等历史名城“对话”五千年中华文明,用帆船浮潜感受刺激的航海冲浪体验,在航空研学基地...【详细内容】
2023-08-05  Search: 订单  点击:(97)  评论:(0)  加入收藏
在甲平台买保险,在乙平台配送订单,骑手身故能否获赔?
本报讯(记者卢越)给外卖骑手投保商业险的是甲平台,骑手发生事故时正配送的是乙平台的订单,保险公司赔不赔?日前,最高人民法院发布了这起保险合同纠纷案。判决确认,众包骑手虽通过...【详细内容】
2023-07-14  Search: 订单  点击:(93)  评论:(0)  加入收藏
广州网约车经营新规:司机端需显示订单抽成比例
IT之家 7 月 2 日消息,6 月 30 日,广州市交通运输局发布关于进一步规范网络预约出租汽车聚合服务经营行为的通知(下称“通知”)。IT之家注意到,通知要求网约车聚合服务经营者落实...【详细内容】
2023-07-03  Search: 订单  点击:(113)  评论:(0)  加入收藏
跨境电商新趋势:众多蓝海平台来华抢订单 首选万里汇当“红娘”
6月27日是第七届联合国“中小微企业日”,万里汇(WorldFirst)今天发布了2023半年度跨境电商趋势盘点,数据显示:广大中国中小微卖家积极出海,今年1-6月用万里汇全球远航服务的中国卖...【详细内容】
2023-06-27  Search: 订单  点击:(175)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条