【HBZ分享】XXL-JOB通过分片广播模式处理海量数据更新

业务需求

有100W用户,需要在每天0点定时将每个用户【当天剩余流量包】重置,如何【采用定时器方式】高效执行重置流量包功能?(这里为了举例子,实际采取惰性更新更为妥当)

答:采用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执行器编写

    /**
     * 分片广播进行100W用户重置
     * @param param
     */
    @XxlJob(value = "shardingJob",init = "init",destroy = "destroy")
    public void shardingJob(String param){

        // 获取当前节点的index 与 总节点数
        int shardIndex = XxlJobHelper.getShardIndex();
        int shardTotal = XxlJobHelper.getShardTotal();
        log.info("当前节点的index = {}, 总结点数 = {}", shardIndex, shardTotal);

        List userIds = this.getUserIds();
        userIds.stream().forEach(id ->{
            if(id % shardTotal == shardIndex){
                
                log.info("该数据的userId = {}", id);
            }
        });
    }

    /**
     * 模拟用户id
     * @return
     */
    private List getUserIds() {
        List userIds = new ArrayList<>();
        for(int i = 0; i < 100 ; i++){
            userIds.add(i + 1);
        }
        return userIds;
    }

【HBZ分享】XXL-JOB通过分片广播模式处理海量数据更新_第1张图片

xxl-job调度中心配置

注意:路由策略选【分片广播】
【HBZ分享】XXL-JOB通过分片广播模式处理海量数据更新_第2张图片

启动5个执行器项目

【HBZ分享】XXL-JOB通过分片广播模式处理海量数据更新_第3张图片

执行调度 观察结果

【HBZ分享】XXL-JOB通过分片广播模式处理海量数据更新_第4张图片
【HBZ分享】XXL-JOB通过分片广播模式处理海量数据更新_第5张图片
【HBZ分享】XXL-JOB通过分片广播模式处理海量数据更新_第6张图片
【HBZ分享】XXL-JOB通过分片广播模式处理海量数据更新_第7张图片
【HBZ分享】XXL-JOB通过分片广播模式处理海量数据更新_第8张图片

你可能感兴趣的:(java,开发语言)