XXL-JOB 中的任务分片调度

在分布式任务调度领域,随着业务规模的扩大,单个任务的处理能力往往无法满足需求。为了提高任务处理的效率,我们通常会将任务拆分成多个子任务,分配给不同的执行器节点并行处理。这种方式被称为分片调度。XXL-JOB 作为一个轻量级的分布式任务调度平台,提供了任务分片调度的功能,可以方便地实现对任务的分片和并行执行。

一、什么是任务分片调度?

任务分片调度是指将一个任务按照一定的策略划分为多个子任务(即分片),然后将这些分片任务分配给多个执行器节点并行处理。这样可以有效地利用多个节点的资源,提升任务的处理效率。

XXL-JOB 中的分片调度主要由调度中心来完成,它会根据预设的分片策略将任务分配到不同的执行器上。每个执行器根据分片信息执行自己负责的那部分任务。

二、XXL-JOB 的分片调度实现

XXL-JOB 的分片调度功能非常灵活,主要通过以下几个步骤来实现:

  1. 分片任务分配:调度中心根据分片数量将任务分配给不同的执行器。每个执行器会收到一个或多个分片,并执行相应的任务。

  2. 分片任务执行:执行器在接收到分片任务后,根据分片参数执行相应的业务逻辑。XXL-JOB 提供了分片序号和总分片数两个参数,开发者可以根据这两个参数来编写具体的业务逻辑。

三、实现分片调度的步骤

  1. 部署xxl-job admin端 分布式任务调度平台XXL-JOB
  2. 路由策略设置为分片
  3. 项目集成xxl-job 
            <dependency>
                <groupId>com.xuxueli</groupId>
                <artifactId>xxl-job-core</artifactId>
                <version>2.4.1</version>
            </dependency>
    xxl:
      job:
        admin:
          addresses: http://127.0.0.1:8080/xxl-job-admin
        ### 执行器通讯TOKEN [选填]:非空时启用;
        accessToken: default_token
        executor:
          ### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
          appname: ${spring.application.name}
          ### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
          address:
          ### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
          ip:
          port: 9999
          logpath: /data/applogs/xxl-job/jobhandler
          ### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
          logretentiondays: 30

  4. 编写分片任务逻辑
 /**
     * 2、分片广播任务
     */
    @XxlJob("shardingJobHandler")
    public void shardingJobHandler() {
        // 分片参数 当前分片
        int shardIndex = XxlJobHelper.getShardIndex();
        //分片总数
        int shardTotal = XxlJobHelper.getShardTotal();

        XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
        Integer[] sharding = ShardUtil.getShardBySharding(shardTotal, shardIndex);
        log.info("当前处理的分片数据{}", Arrays.toString(sharding));
        XxlJobHelper.log("当前处理的分片数据={}", Arrays.toString(sharding));
        LambdaUpdateWrapper<Test> lambdaUpdate = Wrappers.lambdaUpdate();
        lambdaUpdate.in(Test::getShardNo, sharding).set(Test::getCreateTime, LocalDateTime.now());
        testService.update(lambdaUpdate);
    }

 根据shardIndex和shardTotal两个参数,动态计算出当前机器应该执行的分片,表结构中添加分片字段,根据分片字段处理数据。在机器动态扩缩容情况下都能满足需求。

通过自定义工具类ShardUtil计算出对应机器应该执行的分片数据。

   5.执行结果

机器一:

机器二:

四、分片调度的优势

  1. 提高任务处理效率:通过将任务分片,多个节点可以并行处理任务,大大提高了任务处理的效率。

  2. 提升系统的扩展性:可以根据业务需求动态调整分片数量和执行器节点的数量,提升系统的扩展性。

  3. 降低单点故障风险:任务被分片到不同的节点上处理,即使某个节点发生故障,其他节点仍然可以继续执行任务,降低了单点故障的风险。

五、总结

分片调度是 XXL-JOB 中非常实用的一项功能,能够显著提升任务处理的效率和系统的扩展性。在实际应用中,开发者可以根据业务需求,灵活地设置分片数量,并编写相应的任务处理逻辑。通过合理使用分片调度功能,XXL-JOB 能够在分布式任务调度中发挥更大的作用。

希望这篇文章能帮助你更好地理解和应用 XXL-JOB 的分片调度功能,在实际项目中灵活运用这一功能来优化任务处理。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值