xxl-job通过分片广播模式处理海量数据更新
xxl-job
xxl-job: 是一个分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展。
项目地址:https://gitcode.com/gh_mirrors/xx/xxl-job
免费下载资源
·
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 个月前
更多推荐
已为社区贡献9条内容
所有评论(0)