通过阅读篇文章您可以很容易理解平时所使用的开源框架是如何进行任务调度的。而且对于以后业务上碰到需要做时间任务调度的需求,也可以尝试着用实践论算法去实现。
一、时间轮的应用
其实早在1987年,时间轮算法的论文已经发布。论文名称:Hashed and Hierarchical Timing Wheels,公众号回复:TimingWheel,获取PDF版本。
时间轮(TimingWheel)算法应用范围非常广泛,各种操作系统的定时任务调度都有用到,我们熟悉的linux crontab,以及Java开发过程中常用的Dubbo、Netty、Akka、Quartz、ZooKeeper 、Kafka等,几乎所有和时间任务调度都采用了时间轮的思想。
二、时间轮算法的作用
时间轮是一种实现延迟功能(定时器)的巧妙算法。如果一个系统存在大量的任务调度,时间轮可以高效的利用线程资源来进行批量化调度。把大批量的调度任务全部都绑定时间轮上,通过时间轮进行所有任务的管理,触发以及运行。能够高效地管理各种延时任务,周期任务,通知任务等。相比于JDK自带的 Timer、DelayQueue + ScheduledThreadPool 来说,时间轮算法是一种非常高效的调度模型。
不过,时间轮调度器的时间精度可能不是很高,对于精度要求特别高的调度任务可能不太适合,后面我们会分享linux高精度任务调度的实现。因为时间轮算法的精度取决于时间段“指针”单元的最小粒度大小,比如时间轮的格子是一秒跳一次,那么调度精度小于一秒的任务就无法被时间轮所调度。
三、时间轮的实现
3.1 如何实现定时任务调度
定时的任务调度分两种:
一段时间后执行,即:相对时间
指定某个确定的时间执行,即:绝对时间
当然,这两者之间是可以相互转换的,例如当前时