当前位置:首页 > 科技  > 软件

说说XXLJob分片任务实现原理?

来源: 责编: 时间:2024-07-19 08:02:17 504观看
导读XXL Job 是一个开源的分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展的分布式任务调度框架。这两天咱们开发的 AI Cloud 项目中,也使用到了 XXL Job 来执行分布式任务的调度,可以看出它的部署

XXL Job 是一个开源的分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展的分布式任务调度框架。SYv28资讯网——每日最新资讯28at.com

这两天咱们开发的 AI Cloud 项目中,也使用到了 XXL Job 来执行分布式任务的调度,可以看出它的部署和使用虽然步骤很多,但用起来还是很简单的。SYv28资讯网——每日最新资讯28at.com

因为其本身为 Spring Boot 项目,所有对于 Java 程序员来说很友好,而且它还提供中文控制台,所以这也是他能在国内分布式任务调度系统这块一直流行的原因,如下图所示:SYv28资讯网——每日最新资讯28at.com

SYv28资讯网——每日最新资讯28at.com

那么接下来咱们就来聊聊,XXL Job 的路由策略,以及路由策略中分片任务的执行原理。SYv28资讯网——每日最新资讯28at.com

1.路由策略

XXL Job 的路由策略主要作用是在任务执行器集群环境中,决定如何选择合适的执行器来执行任务。SYv28资讯网——每日最新资讯28at.com

XXL Job 路由策略包含以下几个:SYv28资讯网——每日最新资讯28at.com

SYv28资讯网——每日最新资讯28at.com

其中:SYv28资讯网——每日最新资讯28at.com

  • 第一个:选取执行器管理的注册地址列表中的第一个执行器来执行任务;
  • 最后一个:选取执行器管理的注册地址列表中的最后一个执行器来执行任务;
  • 轮询:依次选取执行器管理的注册地址列表中的执行器,周而复始。为了应对多个定时任务同时触发带来的数据一致性问题,XXL-JOB 使用一个静态的同步 Map 来存储每个任务的 jobId 和其对应的计数。每次计数增加后,对执行器地址列表的数量取余,将结果作为索引来获取对应的执行器地址。如果超过 24 小时没有触发调用该任务,会清空 Map 以释放一定空间;
  • 随机:从执行器管理的注册地址列表中随机选取一个执行器来执行任务;
  • 一致性 HASH:实现一致性 HASH 负载均衡算法;
  • 最不经常使用:选择最近最少被调度的执行器执行任务(通过次数维度选取任务);
  • 最近最久未使用:选择距离上次被调度时间最长的执行器执行任务(通过时间维度选取任务),有助于平衡各执行器的工作负载;
  • 故障转移:在任务路由策略选择“故障转移”的情况下,如果执行器集群中的某一台机器出现故障,将会自动 Failover 切换到一台正常的执行器发送调度请求;
  • 忙碌转移:当任务分配到某个执行器时,如果该执行器正处于忙碌状态(可能正在执行其他任务或资源紧张),则会尝试将任务转移到其他相对空闲的执行器上执行;
  • 分片广播:选取执行器管理的注册地址列表中的所有地址,每个地址都执行一次任务。这种方式类似于 MQ 的广播模式,可以将任务广播到集群中的所有执行器上执行。此策略适用于需要在多个执行器上同时执行相同任务的场景,例如数据同步或分布式计算等。

也就是说在这些路由策略中,最复杂的就是分片广播了。SYv28资讯网——每日最新资讯28at.com

2.分片任务实现

所谓的分片广播也就是分片(执行)任务,它是将一个大任务划分为多个子任务并行执行,以提高效率。SYv28资讯网——每日最新资讯28at.com

假设,我们现在要使用分片任务执行一个大数据的查询与处理,此时的实现代码如下:SYv28资讯网——每日最新资讯28at.com

import com.xxl.job.core.context.XxlJobHelper;import com.xxl.job.core.log.XxlJobLogger;import org.springframework.stereotype.Component;import java.util.List;@Componentpublic class ShardingBroadcastJob {    @XxlJob("shardingBroadcastTask")     public void execute(String param) {        // 获取分片参数:分片总数和分片序列号        int shardIndex = XxlJobHelper.getShardIndex();         int shardTotal = XxlJobHelper.getShardTotal();         XxlJobLogger.log("当前节点的 index={}, 总结点数={}, 参数={}", shardIndex, shardTotal, param);        // 模拟获取数据列表        List<String> dataList = getDataList();         // 执行分片逻辑        shardingExecute(dataList, shardIndex, shardTotal);    }    public List<String> getDataList() {        // 这里可以根据实际情况从数据库或其他数据源获取数据列表        // 为了示例简单,直接返回一个固定的列表        return List.of("data1", "data2", "data3", "data4", "data5", "data6", "data7", "data8", "data9", "data10");    }    public void shardingExecute(List<String> dataList, int shardIndex, int shardTotal) {        XxlJobLogger.log("开始执行分片任务,当前分片={}, 总分片数={}", shardIndex, shardTotal);        // 计算当前分片应处理的数据范围        int start = (shardIndex * dataList.size()) / shardTotal;        int end = ((shardIndex + 1) * dataList.size()) / shardTotal;        // 处理当前分片的数据        for (int i = start; i < end; i++) {            String data = dataList.get(i);            XxlJobLogger.log("处理数据: {}", data);            // 在此处添加具体的数据处理逻辑        }        XxlJobLogger.log("分片任务执行完成");    }}

在上述代码中,在execute方法中,通过 XxlJobHelper.getShardIndex() 获取当前分片序号,通过 XxlJobHelper.getShardTotal() 获取总分片数。然后模拟获取了一个数据列表 dataList,接下来使用 shardingExecute 方法执行分片逻辑。SYv28资讯网——每日最新资讯28at.com

在 shardingExecute 方法中,根据分片序号和总分片数计算出当前分片应处理的数据范围,然后遍历该范围内的数据并进行处理(此处仅打印数据,实际应用中可添加具体的数据处理逻辑)。SYv28资讯网——每日最新资讯28at.com

在实际使用时,需要将任务部署到 XXL Job 执行器集群中,并在调度中心配置相应的任务,选择分片广播的路由策略。这样,当调度中心触发任务时,所有执行器都会执行该任务,并根据分片参数处理相应的数据分片,这样就能提升程序整体的执行效率了。SYv28资讯网——每日最新资讯28at.com

3.执行原理

了解了 XXL Job 的代码实现就能明白其运行原理,它的实现原理如下:SYv28资讯网——每日最新资讯28at.com

  • 任务配置与分发:在 XXL Job 的调度中心,用户通过 Web 界面创建一个分片广播类型的任务,并设置相应的参数,如分片总数(shardingTotalCount)。当调度触发时,调度中心会将此任务广播至所有注册的执行器。
  • 分片参数传递:每个执行器在接收到广播的任务时,会自动获得分片参数,包括分片总数和当前执行器应该处理的分片序号(shardingItem)。这些参数由 XXL Job 框架自动注入,使得执行器能够知道它应当处理哪个数据分片。
  • 分片逻辑执行:实际的分片逻辑需要在执行器的任务处理器代码中实现,开发者需根据分片序号和总数,决定处理哪些数据。这通常涉及对数据源的分片访问,如数据库查询时使用分页查询或者 ID 取模等方法来确定每个执行器处理的数据范围。然后各个执行器并行处理各自分片的数据,互不影响。
  • 结果汇总:由于是广播任务,每个执行器处理的是全量数据的一个子集,因此不存在汇总操作,每个执行器独立完成自己的处理逻辑。如果需要最终汇总结果,需要额外的逻辑来收集和整合各个执行器的输出。

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-101719-0.html说说XXLJob分片任务实现原理?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 深入探索 Vite 的热更新(HMR)实现

下一篇: 软件版本号为什么那么奇怪?

标签:
  • 热门焦点
  • SpringBoot中使用Cache提升接口性能详解

    SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 如何正确使用:Has和:Nth-Last-Child

    如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 如何使用JavaScript创建一只图像放大镜?

    如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 使用AIGC工具提升安全工作效率

    使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 腾讯盖楼,字节拆墙

    腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • onebot M24巧系列一体机采用轻薄机身设计,现已在各平台开售

    onebot M24巧系列一体机采用轻薄机身设计,现已在各平台开售

    onebot M24 巧系列一体机目前已在线上线下各平台同步开售。onebot M24 巧系列采用一体化轻薄机身设计,最薄处为 10.15mm,拥有宝石红、午夜蓝、石墨绿、雅致
  • 与兆芯合作  联想推出全新旗舰版笔记本电脑开天N7系列

    与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top
Baidu
map