定时任务
需要频繁 扫描主订单号 ,造成磁盘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过期事件的监听类