xxl-job通过分片广播模式
1. 什么是分片广播:即xxl-job调度中心发出一次调度,所有相关节点全部执行一次

2. 采用传统轮询调度缺点:轮询调度只会调度某一台节点,也就是这100W数据都会冲击到1台节点执行,显然效率不合格。

3. 采用分片广播调度优点1:发动所有节点同时执行,即100W的用户数据,均匀分配到所有节点,每个节点只需要执行部分数据即可,当然具体分片策略需要在代码逻辑中进行编写,调度中心做的只是让所有节点全部执行

4. 采用分片广播调度优点2:xxl-job会为每个注册节点分配一个index,这个index是xxl-job自行分配的,可以获取到,并且xxl-job也可以记录注册节点的总个数,总个数也可以获取到

5. 本案例解决方案:通过获取注册节点总个数totalCount 与 每个节点对应的index。 我们采用
【用户id % totalCount = index】的方式,即余数=1,该条数据的重置就在对应index=1的节点上执行

xxl-job执行器编写

    /**
     * 分片广播任务
     */
    @XxlJob("shardingJobHandler")
    public ReturnT<String> shardingJobHandler(String param) throws Exception {
        log.info("参数:" + param);
        // 分片参数
        ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
        XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());
        log.info("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());
        // 业务逻辑
        for (int i = 0; i < shardingVO.getTotal(); i++) {
            if (i == shardingVO.getIndex()) {
                XxlJobLogger.log("第 {} 片, 命中分片开始处理", i);
                log.info("第 {} 片, 命中分片开始处理", i);
            } else {
                XxlJobLogger.log("第 {} 片, 忽略", i);
                log.info("第 {} 片, 忽略", i);
            }
        }

        return ReturnT.SUCCESS;
    }

显然调度中心每次调度任务都会响应到所有的定时任务上,只是不同的服务命中的分片不一样。分片的值是调度中心分配的。 

 如果两个停一个,分片总数会发生变化,并且当前分片数也可能会发生变化。

GitHub 加速计划 / xx / xxl-job
27.16 K
10.79 K
下载
xxl-job: 是一个分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展。
最近提交(Master分支:3 个月前 )
e5d26ba2 - 4 个月前
977ad87b - 4 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐