XXL-Job-分布式任务调度

178 阅读2分钟

一、XXL-Job 解决的问题

  • 解决集群任务的重复执行问题
  • cron表达式定义灵活
  • 定时任务失败了,重试和统计
  • 任务量大,分片执行

二、XXL-Job的路由策略有哪些?

假设现在XXL-Job服务集群中有两台实例,需要执行的任务有6条。那么这些任务分别在哪台实例上执行呢?通过路由策略就可以解决这个问题。

1692449048770.jpg

  1. FIRST:固定选择第一个机器。
  2. LAST:固定选择最后一个机器。
  3. ROUND:轮询。
  4. RANDOM:随机选择在线的机器。
  5. CONSISTENT_HASH(一致性HASH):每个任务按照hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
  6. LEAST_FREQUENTLY_USED(最不经常使用): 使用频率最低的机器优先被选举。
  7. LEAST_RECENTLY_USED(最近最久未使用):最久未使用的的机器优先被选举。
  8. FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度。
  9. BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度。
  10. SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自发传递分片参数。可根据分片参数开发分片任务。 适合任务量比较大的任务。

二、XXL-Job任务执行失败,怎么解决?

  1. 路由策略故障转移+失败重试

1692449913310.jpg

  1. 查看日志分析

1692450015448.jpg 3. 设置邮件告警

需要在代码中设置邮箱的IP、PORT、协议等信息,并且在XXL-JOB控制台中设置邮箱。

1692450084052.jpg

1692450184572.jpg

三、如何同时执行大数据量任务?

执行器集群部署时,任务路由策略选择分片广播情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务。

1692459340952.jpg

分片参数:

  • index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号。
  • total: 总分片数,执行器集群的总机器数量。

任务项找到分片:index = 任务项ID % total

@XxlJob("shardingSample")
public void shardingJobHandler() {
    //分片参数
    int shardIndex = XxlJobHelper.getShardIndex();
    int shardTotal = XxlJobHelper.getShardTotal();
    //业务逻辑
    List<Integer> list = getList();
    for (Integer integer : list) {
        if (integer % shardTotal == shardIndex) {
            System.out.println("第" + shardIndex + "分片执行,执行数据为:" + integer);
        }
    }
}