编程语言
首页 > 编程语言> > xxl-job源码阅读——(五)快慢线程池与负载策略解析

xxl-job源码阅读——(五)快慢线程池与负载策略解析

作者:互联网

文章目录


本章介绍init()第五个步骤,初始化调度器的trigger线程池,以及trigger一个任务的详细流程。

一. 快慢线程池

定义

慢任务处理

到此方法结束,接下来我们继续深入trigger。

二. 负载算法

群起而攻之——分片广播

这就是分片广播算法,接下来我们看一下源码实现。

接下来,进入最终的处理逻辑,processTrigger()

其他负载算法

负载算法

回到上面第四步,ExecutorRouteStrategyEnum.getRouter方法。
见下图,这个枚举类,实际上还保存了不同负载策略对应的处理类实例。

这些实例,从上到下与页面一一对应

前四个没什么好说的,字面意思。

一致性Hash算法


如图所示,一致性Hash算法的目的在于构建一个被节点均等分的圆环,当一个任务到来,落在区间的某一个点上时,向上取节点为执行节点,如图中,Node3将成为任务A的执行节点

优势: 一致性Hash算法的优势在于节点的动态增减对任务的影响小,如图,如果将节点Node3断开,那么此时的任务A将被Node4执行。

缺点:负载的均衡性不好保障,100任务到来,我们如何能够保证100个任务能够均匀的散落这四个区间上?有同学可能会说给任务按照节点数量取模,那这样不就又回到类似轮询的负载策略了吗?

一致性Hash的负载均衡问题还是要靠概率方法解决,如下。

带虚拟节点的一致性Hash算法

虚拟节点通过扩大节点数量来解决均衡问题。

如图所示,这是将3个节点数量扩大3倍,可以看出任务A落在某个节点的随机性将极大的增加,如果我们将节点数量无限制扩大,理论上就可以得到一个完全均衡的分布。

xxl-job正是使用这种方式来实现:

LRU与LFU

LRU: 最近最久未使用,这里使用了LinkedHashMap的accessOrder(访问后排序)功能实现,比较简单,不再赘述。

LFU:最近最不常使用


故障转移与忙碌转移

故障转移: 如果机器还活着,就用。
如图代码所示,逻辑很直接,对地址进行for循环,每一个进行心跳检测,只要有一个心跳成功就使用,显然这个逻辑会一直使用活着的第一个节点。

忙碌转移: 与故障转移唯一的区别,是不调用心跳检测接口,而是是否空闲idleBeat接口。

我们看一下执行器端idleBeat的实现:

执行器端缓存了jobId与线程实例的关系,这里直接判断了对应线程实例是否在执行任务,是否还有未执行的任务,都没有才认为是空闲的。


欢迎关注微信公众号 【JAVA技术分享官】,公众号首发,持续输出原创高质量JAVA开发者知识点

标签:执行器,负载,job,算法,源码,线程,任务,节点
来源: https://blog.csdn.net/qq_35946969/article/details/122567745