天天看点

对于时间轮算法的一些思考

最近一直在使用当当的分布式任务调用框架,但是由于zk集群是依赖别人的一直想换一套耦合性较低的,偶然的机会在看完许大神开源的xxl-job后萌生了自研的想法。在查询了一些资料后发现大部分的延迟算都是基于时间轮,例如kafka的延迟队列。

对于时间轮算法的一些思考

一、为什么使用时间轮算法

时间轮是一种高效来利用线程资源来进行批量化调度的一种调度模型。把大批量的调度任务全部都绑定到同一个的调度器上面,使用这一个调度器来进行所有任务的管理(manager),触发(trigger)以及运行(runnable)。能够高效的管理各种延时任务,周期任务,通知任务等等。

二、时间轮缺点

时间轮的精度取决于每一格精度,精度越小误差越小,且时间轮无法备份,当服务器宕机时会丢失所有任务。

三、复合时间轮

有时候有些任务会是几小时、几天甚至几月一次,单个时间轮无法穷举所有可能性,这时可以按照时钟的方式,通过多层时间轮来实现,例如:定义一个时间轮为60秒每秒跳一次,使用60+60+60+60+60的五层时间轮可以表示出长达24年的时间。

对于高层的时间轮如果遇到过期任务时,只需要将任务再重新放入下一层时间轮中就可以达到继续定时的效果了。

四、最后的一些想法

这个提议最终还是没有落地各种原因就不说了心累,以目前的想法对于中小型系统使用时间轮可以达到延时和高可用的目的,如果全公司统一使用还有一些挑战,例如:

1、各任务耗费的调试资源不一,有些任务可能几天一次,有些任务可能一秒一次,如何更好的均匀这些任务达到资源最大利用率。

2、单服务器的调度吞吐量是有限的,同时一个任务做高可用往往也只需要二台左右的服务器即可,那么整个大集群中,如何更好的分发任务达到整个集群最大吞吐量。