定时任务如何触发

425 阅读2分钟

我的公众号:

image.png

在软件开发当中,我们会经常遇到定时任务的功能,有哪些方式可以实现,且哪些方式比较好呢?

图片   、Timer定时器

(1)一种是定义一个Timer,去轮询。

(2)第二种是每个任务各自定义一个Timer,当各自的任务执行完成,就销毁Timer

第一种:效率低

第二种:启动了多个Timer,比较耗资源

图片 二、 QuartZ定时任务

Quartz一款非常经典任务调度框架,在Redis、RabbitMQ还未广泛应用时,超时未支付取消订单功能都是由定时任务实现的。定时任务它有一定的周期性,可能很多单子已经超时,但还没到达触发执行的时间点,那么就会造成订单处理的不够及时。

图片 三、环形队列

环形队列,就是将一个环形分成很多份,比如我们这里每个任务都是在60秒后超时,我们就把环形分成60份,每份里面是一个任务集合,启动一个Timer,每秒绕这个环形走一格,到了哪一格,我们就把当前任务集合全部失效。

1-只需要启动一个Timer,

2-每秒只需要一次触发,

3-批量超时失效掉集合中的所有任务

但这个方式有个限制,就是环形分多少份的问题,所以这里使用场景通常是适用超时时间相对固定的所有任务,比如我们上面说的每个任务都是在60秒后触发,比如具体的业务如每个订单下单60秒后给用户发送通知消息,每个订单的下单时间是不一样的,但触发发送通知消息是一样的都是60秒,我们可以把每个订单的通知消息任务触发时间放到环形队列中。****

图片 四、Redis

有些时候,我们借用Redis的过期机制来实现定时任务的作用,比如下单后30分钟未支付就取消订单,Redis就可以定一个超时时间为30分钟,到了30分钟Redis缓存失效,当用户在来查看订单时,缓存中没有订单就可以认为订单被取消了,这个通常不适用于当超时时除了超时取消掉订单还要触发其他业务的场景,它只是借用缓存不存在来当做取消订单。

图片 五、延迟队列

比如RabbitMQ,有个延迟队列,当到了指定的时间后,消息才发送,消息的消费方可以根据接收到的消息处理任何各自的任务,性能也是很不错的,