【进阶】XXL-Job分布式调度多案例实战

DBC 192 0

一、分布式调度参数传递和调度日志配置

简单获取参数

【进阶】XXL-Job分布式调度多案例实战插图

        String jobParam = XxlJobHelper.getJobParam();
        log.info("dbc方法调用成功——"+ jobParam);
温馨提示

就这么简单就能获取到参数,获取的参数如下图:
【进阶】XXL-Job分布式调度多案例实战插图2
效果如下:
【进阶】XXL-Job分布式调度多案例实战插图4

日志打印操作

    XxlJobHelper.log("这个是执行日志:param="+jobParam);

【进阶】XXL-Job分布式调度多案例实战插图6
【进阶】XXL-Job分布式调度多案例实战插图8

执行结果修改

设置任务结果为失败

XxlJobHelper.handleFail("任务执行失败!");

【进阶】XXL-Job分布式调度多案例实战插图10

设置任务结果为成功

        XxlJobHelper.handleSuccess("任务执行成功!");

【进阶】XXL-Job分布式调度多案例实战插图12

二、【高级】XXL-Job集群部署和高可用案例配置

简单画了个高可用集群部署[aru_36]

【进阶】XXL-Job分布式调度多案例实战插图14

上代码

#调度中心部署地址,多个配置逗号分隔 "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8081/xxl-job-admin,http://127.0.0.1:8082/xxl-job-admin

【进阶】XXL-Job分布式调度多案例实战插图16

温馨提示

其实就是简单的配置一下配置文件而已,比起其他的mq,啥的集群要简单多了,我们多启动几个调度中心,当其中有宕机的时候,我们的定时任务也不会受到影响。

三、【高级】XXL-Job海量数据处理-分片任务实战

  • 需求
    • 有一个任务需要处理100W条数据,每条数据的业务逻辑处理要0.1s
    • 对于普通任务来说,只有一个线程来处理 可能需要10万秒才能处理完,业务则严重受影响
    • 案例:双十一大促,给1000万用户发营销短信

     

  • 什么是分片任务
    • 执行器集群部署,如果任务的路由策略选择【分片广播】,一次任务调度将会【广播触发】对应集群中所有执行器执行一次任务,同时系统自动传递分片参数,执行器可根据分片参数开发分片任务
    • 需要处理的海量数据,以执行器为划分,每个执行器分配一定的任务数,并行执行
    • XXL-Job支持动态扩容执行器集群,从而动态增加分片数量,到达更快处理任务
    • 分片的值是调度中心分配的

【进阶】XXL-Job分布式调度多案例实战插图18

  • 解决思路
    • 如果将100W数据均匀分给集群里的10台机器同时处理,
    • 每台机器耗时,1万秒即可,耗时会大大缩短,也能充分利用集群资源
    • 在xxl-job里,可以配置执行器集群有10个机器,那么分片总数是10,分片序号0~9 分别对应那10台机器。
    • 分片方式
      • id % 分片总数 余数是0 的,在第1个执行器上执行
      • id % 分片总数 余数是1 的,在第2个执行器上执行
      • id % 分片总数 余数是2 的,在第3个执行器上执行
      • ...
      • id % 分片总数 余数是9 的,在第10个执行器上执行

代码实战

    @XxlJob(value = "shardingJobHandler")
    public void shardingJobHandler(){
        // 当前的执行器编号
        int shardIndex = XxlJobHelper.getShardIndex();

        // 总的分片数,就是执行器的集群数量
        int shardTotal = XxlJobHelper.getShardTotal();
        log.info("分片总数:{},当前分片数{}",shardTotal,shardIndex);
        List<Integer> allUserIds = getAllUserIds();

        allUserIds.forEach(obj->{
            if (obj % shardTotal == shardIndex){
                log.info("第{}片,命中分片开始处理用户id={}",shardIndex,obj);
            }
        });
    }
    private List<Integer> getAllUserIds(){
        List<Integer> ids = new ArrayList<>();
        for (int i=0;i<100;i++){
            ids.add(i);
        }
        return ids;
    }
温馨提示

我们启动三个执行器,然后去调度中心配置一下。
【进阶】XXL-Job分布式调度多案例实战插图20
重点就是箭头所指的地方,我们使用分片广播,然后点击执行一次
【进阶】XXL-Job分布式调度多案例实战插图22
可以很清晰的看到,我们的三个执行器已经按照我们指定的规则进行同时执行任务了,这样我们就实现了我们前面说的操作!

发表评论 取消回复
表情 图片 链接 代码

分享