在分布式任务调度领域,随着业务规模的扩大,单个任务的处理能力往往无法满足需求。为了提高任务处理的效率,我们通常会将任务拆分成多个子任务,分配给不同的执行器节点并行处理。这种方式被称为分片调度。XXL-JOB 作为一个轻量级的分布式任务调度平台,提供了任务分片调度的功能,可以方便地实现对任务的分片和并行执行。
一、什么是任务分片调度?
任务分片调度是指将一个任务按照一定的策略划分为多个子任务(即分片),然后将这些分片任务分配给多个执行器节点并行处理。这样可以有效地利用多个节点的资源,提升任务的处理效率。
XXL-JOB 中的分片调度主要由调度中心来完成,它会根据预设的分片策略将任务分配到不同的执行器上。每个执行器根据分片信息执行自己负责的那部分任务。
二、XXL-JOB 的分片调度实现
XXL-JOB 的分片调度功能非常灵活,主要通过以下几个步骤来实现:
-
分片任务分配:调度中心根据分片数量将任务分配给不同的执行器。每个执行器会收到一个或多个分片,并执行相应的任务。
-
分片任务执行:执行器在接收到分片任务后,根据分片参数执行相应的业务逻辑。XXL-JOB 提供了分片序号和总分片数两个参数,开发者可以根据这两个参数来编写具体的业务逻辑。
三、实现分片调度的步骤
-
部署xxl-job admin端 分布式任务调度平台XXL-JOB
-
路由策略设置为分片
-
项目集成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
-
编写分片任务逻辑
/**
* 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.执行结果
机器一:
机器二:
四、分片调度的优势
-
提高任务处理效率:通过将任务分片,多个节点可以并行处理任务,大大提高了任务处理的效率。
-
提升系统的扩展性:可以根据业务需求动态调整分片数量和执行器节点的数量,提升系统的扩展性。
-
降低单点故障风险:任务被分片到不同的节点上处理,即使某个节点发生故障,其他节点仍然可以继续执行任务,降低了单点故障的风险。
五、总结
分片调度是 XXL-JOB 中非常实用的一项功能,能够显著提升任务处理的效率和系统的扩展性。在实际应用中,开发者可以根据业务需求,灵活地设置分片数量,并编写相应的任务处理逻辑。通过合理使用分片调度功能,XXL-JOB 能够在分布式任务调度中发挥更大的作用。
希望这篇文章能帮助你更好地理解和应用 XXL-JOB 的分片调度功能,在实际项目中灵活运用这一功能来优化任务处理。