XXL-job调度策略的研究报告
XXL-job调度策略的研究报告
- 阻塞策略研究
XXL-job一共有如下三种任务阻塞策略:单机串行、丢弃后续调度、覆盖之前调度(如下图)
不同阻塞策略的研究:
实验结果如下表:
不同阻塞策略下不同执行器的执行结果 | ||
| 执行器1 | 执行器2 |
单机串行 | 接受到两次,执行两次,按顺序执行 | 接受到两次,执行两次,按顺序执行 |
丢弃后续调度 | 对重复的任务只接受一次(接受到一次) | 对重复的任务只接受一次(接受到一次) |
覆盖之前调度 | 在执行过程中如果收到了同一个任务会立马停掉当前任务去执行最新进来的任务(接受到两次) | 在执行过程中如果收到了同一个任务会立马停掉当前任务去执行最新进来的任务(接受到两次) |
- 路由策略的研究
1.第一个:当有任务待执行器执行时,调度中心会将任务下发到权重较高(路由路径最短的)的执行器,比如当我们将执行器与调度器同时部署在同一台服务器上,那么此执行器的权重最高,它为第一个,如果它挂了那么,90s以后会重新设置第一个。在执行过程中挂了,那么此任务执行失败,在未来的90s内有新的任务进来也将会失败。
2.最后一个:原理同上
3.随机:当有任务待执行器执行时,调度中心会将任务随机下发某个执行器上,在执行过程中挂了,那么此任务执行失败,在未来的90s内有新的任务进来也将会失败。
4.轮询:原理同上
5.一致性HASH:原理同上
6.最不经常使用:原理同上
7.最近最久未使用:原理同上
8.故障转移:当有任务待执行器执行时,调度中心会将任务随机下发某个执行器上,在执行过程中挂了,那么此任务执行失败,下一次任务进来时立马分派到新的存活的服务器上,不必等待90s
9.忙碌转移:原理同上
10.分片广播:原理同上
总结:阻塞策略是用来设置任务该如何执行,路由策略是用来分发任务,两者是完全不同的概念。
问题1:如何设置让调度器更快将不可用的执行器移除?
答:参看源码:设置RegistryConfig.DEAD_TIMEOUT的时间即可。
//来自于包:
package com.xxl.job.admin.core.thread;
// remove dead address (admin/executor)
List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
//设置具体时间:
public class RegistryConfig {
public static final int BEAT_TIMEOUT = 30;
public static final int DEAD_TIMEOUT = BEAT_TIMEOUT * 3;
public enum RegistType{ EXECUTOR, ADMIN }
}
问题2:假设我有如下情况他的执行结果是怎样的?
阻塞策略使用覆盖之前的之前调度,同时路由策略采用故障转移,这个任务执行所需花费的时间是30s,在30s内我发送了两次执行该任务的请求,那么他的执行结果是怎样的?
答:因为我们采用的是故障转移的路由策略,所以我们要搞清楚我们的两次执行该任务的请求是在发生故障之前发的还是在发生故障以后发的,比如第一个请求发送过去,然后紧接着发送第二个,在两个请求都发送出去时才挂掉,那么此次任务执行失败,反之,如果第一次请求发送过去执行了10s,然后执行器挂了,然后发起了第二次请求,那么此时第二次任务请求被转移到新的执行器上,第二次请求执行成功。
更多推荐
所有评论(0)