1.广播任务和动态分片
2. 什么是作业分片
作业分片是指任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的应用实例 分别执行某一个或几个分片项。
3. XXL-JOB分片
- 广播任务: 执行器集群部署,任务路由策略选择”分片广播”情况下,一次任务调度将会广播触发集群中所有执行器 执行一次任务,系统会自动传递分片参数,可根据分片参数开发分片任务;
- 动态分片: 分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群,从而动态增加分片数量,协同进行 业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
3.1 XXL-JOB支持分片的好处
- 分片项与业务处理解耦 XXL-JOB并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需 要自行处理分片项与真实数据的对应关系。
- 最大限度利用资源 基于业务需求配置合理数量的执行器服务,合理设置分片,作业将会最大限度合理的利用分布式资源。
4.分片广播案例演示
目标:实现XXL-JOB作业分片的演示
方案分析:规划一个任务,两个分片,对应两个执行器,每个分片处理一部分任务。
4.1实现步骤:
- 创建分片执行器
- 创建任务指定刚才创建的分片执行器,在路由策略这一栏选择分片广播
- 分片广播代码分片参数属性说明:
- index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号;
- total:总分片数,执行器集群的总机器数量;
/**
* 2、分片广播任务
*/
@XxlJob("shardingJobHandler")
public ReturnT<String> shardingJobHandler(String param) throws Exception {
// 分片参数
ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());
List<Integer> list = getList();
for (Integer integer : list) {
if(integer % shardingVO.getTotal() == shardingVO.getIndex()){
System.out.println("第"+shardingVO.getIndex()+"分片执行,执行数据为:"+integer);
}
}
return ReturnT.SUCCESS;
}
public static List<Integer> getList(){
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10000 ; i++) {
list.add(i);
}
return list;
}