June's Studio.

怎么不用定时任务实现关闭订单

字数统计: 413阅读时长: 1 min
2023/02/02

定时任务

需要频繁 扫描主订单号 ,造成磁盘IO 和网络 IO的消耗 ,对实时交易产生影响

rocketmq延迟队列

消息延迟级别分别为1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h ,共18个级别

recordMsg.setDelayLevel(14); // 第14个级别 ,即10分钟

缺点不够灵活, 商业版支持自定义时间

rabbitMq死信队列

时间轮算法

创建环形队列,例如可以创建一个包含3600个slot的环形队列(本质是个数组)

任务集合,环上每一个slot是一个Set 同时,启动一个timer,这个timer每隔1s,在上述环形队列中移动一格,有一个Current Index指针来标识正在检测的slot。

urrent Index不停的移动,每秒移动到一个新slot,这个slot中对应的Set,每个Task看Cycle-Num是不是0:

(1)如果不是0,说明还需要多移动几圈,将Cycle-Num减1

(2)如果是0,说明马上要执行这个关单Task了,取出订单号执行关单(可以用单独的线程来执行Task),并把这个订单信息从Set中删除即可。

(1)无需再轮询全部订单,效率高 (2)一个订单,任务只执行一次 (3)时效性好,精确到秒(控制timer移动频率可以控制精度)。

redis过期监听

修改redis.windows.conf配置文件中notify-keyspace-events的值 默认配置notify-keyspace-events的值为 “” 修改为 notify-keyspace-events Ex 这样便开启了过期事件

创建配置类RedisListenerConfig(配置RedisMessageListenerContainer这个Bean)

继承KeyExpirationEventMessageListener创建redis过期事件的监听类

CATALOG
  1. 1. 定时任务
  2. 2. rocketmq延迟队列
  3. 3. rabbitMq死信队列
  4. 4. 时间轮算法
  5. 5. redis过期监听