目录
一、前言
前段时间一个朋友问:让实现一个30分钟如果订单未支付,系统自动取消订单的功能需求,当时巴拉巴拉给他说了几种方案;
那么,今天着重挑选一种通用、效率高的方案给大家讲解一下;
Demo源码地址详见:《Alipay_demo》 下载即可使用好文章 记得收藏+点赞+关注额 !!!
---- Nick.Peng
二、实现方案分析
-
方案1:统一的定时任务,每隔1分钟轮询执行,来处理订单
缺点: 一听到轮询,肯定是不建议大家使用的,每隔一分钟处理一次,过于频繁的请求,增加服务器的负担。并且会有1分钟的误差,因为定时任务设置每隔1分钟执行一次。
优点: 实现简单 -
方案2:利用mq的延迟发送特性处理 + 定时任务
下单后,发送一条消息给mq,并设置mq,30分钟后再处理发送消息动作
优点: 时间准确性相对高,一个单子只执行一次,并发高。
缺点:
1、当大量消息堆积的时候,同样存在延迟的问题。同时还可能存在消息丢失风险。(rocketmq号称0丢失)
2、基本上mq,都是默认不开启延迟发送的,需要开启mq延迟发送功能,且会增加mq的一部分性能负担。 -
方案3:利用redis的过期key特性处理
优点: 时间准确性相对高,一个单子只执行一次,过期key到期自动消失。
缺点:
1、消息只发送一次,不管有没有处理成功。
2、当很多key同时过期时,存在延迟问题。
3、redis默认是不开启这个功能的,需要开启redis过期key的监听订阅,会增加redis的一部分性能负担。 -
方案4:写一套30分钟后处理的定时任务
当下单后,新建一个30分钟后处理的定时任务
优点: 时间准确性高,一个单子只执行一次。(可以使用Apscheduler定时框架+redis)
缺点: 需要频繁新建定时任务,并且需要删除处理过无用的定时任务。 -
方案5:在订单列表视图中实现一套30分钟取消订单的逻辑
三、Redis key过期事件方案实现步骤
Re:
Redis 自2.8.0之后版本提供了 Keyspace Notifications 功能,允许客户订阅 Pub / Sub 频道,以便以某种方式接收影响 Redis 数据集的事件。
3.1 Redis 安装步骤详见
3.2 修改 Redis 配置
- 找到 redis.conf 配置文件,一般在/etc/redis/redis.conf,可以通过以下方式查看:

- 修改 Redis 配置文件,找到
notify-keyspace-events Ex,默认是被注释的,打开注释,并将下面的notify-keyspace-events ""加上注释即可

# =

最低0.47元/天 解锁文章
1028

被折叠的 条评论
为什么被折叠?



