XXLjob分片策略、阻塞处理策略知识汇总

发布时间 2023-06-27 17:54:46作者: 郭慕荣

一、路由策略-分片策略场景描述
一般在集群环境下,我们job被部署了多个节点,xxl-job需要做到只要有一个节点去执行job,这时候需要依赖xxl-job的任务路由策略进行分配节点。xxl-job提供的路由策略有:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移、分片广播。对于简单的任务,我们选择轮询、随机、故障转移都是可以的,但是对于执行时间长的任务,我们希望能分散到各个节点上执行,从而加快完成的速度,这时候就需要用到分片广播。jobhandler代码如下所示,要取出要更新的id,然后判断取模是不是本台机器处理,如果是本台机器需要处理的,再根据id查询数据,处理数据。这就是分片的逻辑,主要是目的提高速度。

/**
 * 分片广播任务
 */
@XxlJob("shardingJobHandler")
public void shardingJobHandler() throws Exception {

    // 分片参数
    int shardIndex = XxlJobHelper.getShardIndex();
    int shardTotal = XxlJobHelper.getShardTotal();

    XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
    //获取需要处理的所有门店列表
    List<StoreInfo> storeInfoList = storeInfoMapper.selectList(new QueryWrapper<StoreInfo>().lambda().orderByDesc(StoreInfo::getStoreCode));

    //当前分片需要处理的门店列表
    List<StoreInfo> shardStoreInfoList = new ArrayList<>();
    // 业务逻辑
    for (int i = 0; i < storeInfoList.size(); i++) {
        if (i % shardTotal == shardIndex) {
            //将当前分片需要处理的门店加入list
            shardStoreInfoList.add(storeInfoList.get(i));
        }
    }
    //处理业务逻辑...
    service.doBusiness(shardStoreInfoList);
}

二、XLL-JOB阻塞处理策略类型
1、单机串行(默认)
调度进入单机执行器后,调度请求进入FIFO队列中并以串行方式运行
2、丢弃后续调度(推荐)
调度请求进入单机执行器,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败
3、覆盖之前调度(不推荐)
调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度

单机串行情况下:如果一个任务没有执行完毕,第二次任务执行又开始了,那么第二次会一直等待直到第一次执行完毕才会执行第二次任务调度,这样如果任务频率比较高,同时执行时间长,不建议使用这种方式,这样会导致阻塞i的任务越来越多。

参考文档:
https://blog.csdn.net/weixin_45427648/article/details/129655126
https://blog.csdn.net/dongdong199033/article/details/129759364
https://www.jianshu.com/p/281972cd7b5b
https://www.xuxueli.com/xxl-job/#/