Elastic-Job 分布式任务调度

2024-03-22 23:20

本文主要是介绍Elastic-Job 分布式任务调度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、使用场景

(1)分布式项目中 定时任务。如果只部署一台机器,可用性无法保证,如果定时任务机器宕机,无法故障转移,如果部署多台机器时,同一个任务会执行多次,任务重复执行也会出问题。

(2)分布式项目 任务分片执行。将一个任务拆分为 多个独立的任务项,然后由分布式服务器分别执行 某一个或几个分片项。

Elastic-Job是当当推出的分布式任务调度框架,基于Zookepper、Quartz开发的Java分布式定时任务解决方案。用于解决分布式任务的协调调度问题,保证任务不重复不遗漏地执行。它由两个相互独立的子项目Elastic-Job-LiteElastic-Job-Cloud组成,本文主要介绍Elastic-Job-Lite

特点:任务的分布式协调调度、多种分片策略、弹性扩容缩容、失效转移、错过任务重执行、多种作业类型。

Elastic-Job-Lite定位为轻量级无中心化任务调度解决方案,使用jar包的形式提供分布式任务的协调服务,Elastic-Job-Lite 为纯粹的作业中间件,仅关注分布式调度、协调以及分片等核心功能;

Elastic-Job-Cloud额外提供资源治理、应用分发以及进程隔离等功能

二、使用

1、引入依赖

<dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-spring</artifactId><version>2.1.6-SNAPSHOT</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.7.RELEASE</version>
</dependency>

2、Zookeeper配置

elastic-job.zookeeper.nameSpace=项目名称

3、实现SimpleJob,重写excute()执行方法

public class MySimpleJob implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {String name = this.getClass().getSimpleName();int item = shardingContext.getShardingItem;    // 获取执行机器IDtry{// 要定时执行的业务代码} catch (Exception e) {}}
}

4、任务配置,通过Job.xml进行任务配置

<job:simpleid="MySimpleJob"class="com.google.task.MySimpleJob"    <-- 任务实现类路径 -->overwrite="true"    <-- 本地配置是否覆盖注册中心配置 -->description="Job的中文描述"event-trace-rdb-data-source="JobEventDataSource"    <-- 作业事件追踪的数据源Bean引用 -->registry-center-ref="zookeeperRegistryCenter"    <-- 注册中心 -->cron="0 0 1 * * ?"    <-- 每天一点执行 -->job-parameter="AUTO"    <-- 作业自定义参数 -->sharding-total-count="1"    <-- 分片总数 -->job-sharding-strategy-type="ROUND_ROBIN"    <-- 分片策略 --><job:listener class="com.google.task.listener.MyElasticJobListener" />    <-- 监听器 -->
</job:simple>

还有以下常用配置项:

sharding-item-parameters:分片序列号和参数配置,多个键值','逗号隔开,分片序列号从0开始,不能大于或等于分片总数,0=a,1=b,2=c

failover:是否开启失效转移,默认false

misfire:是否开启错过任务重新执行,默认true

executor-service-handler:扩展作业处理线程池类

5、启动类 配置job.xml 通过Spring启动,任务将自动加载

@ImportResource(locations = {"classpath:spring/job.xml"})

三、分片策略

分片项:即任务拆分的个数,为数字,从0开始 到 分片总数-1

Elastic-Job是将分片项 分配给各个服务器。

Elastic-Job自带了三种分片策略,默认是 平均分片策略

1、平均分片(AVG_ALLOCATION)

根据分片项平均分片;

如果 服务器数量与分片总数 无法整除,多余的分片 将会顺序的分配至每一个任务服务器

2、奇偶分片(ODEVITY)

根据 任务名称哈希值的奇偶数 按任务服务器 IP升序或是降序的方式分片;

任务名称哈希值是偶数,按 IP地址 升序分片

任务名称哈希值是奇数,按 IP地址 降序分片

3、轮询分片(ROUND_ROBIN)

根据作业名称轮询分片;

四、失效转移

将分片总数设置为1,运行多个服务器,任务会以1主n从的方式执行。

Elastic-Job不允许执行过程中重新分片,下次任务启动之前才能 重新分片,所以 有服务宕机则未执行完成的任务只能下次任务启动再执行。开启失效转移 可以尽快执行。

失效转移:一旦有执行任务的服务器崩溃或执行异常,则会立即有其他服务器替补执行任务。

错过任务重执行:在运行耗时较长且间隔较长的作业场景,可以开启 “错过任务重执行”,  是提升作业运行实时性的有效手段

misfire=true

五、Elastic-Job 的3种作业类型

1、Simple类型:即为简单实现,未经任何封装的类型,需实现SimpleJob接口,该接口仅提供单一执行方法用于覆写,此方法将定时执行。提供了弹性扩缩容和分片等功能

2、Dataflow类型:用于处理数据流,需实现DataflowJob接口,该接口提供2个方法可供覆盖,分别用于抓取(fetchData)和处理(processData)数据

3、Script类型:即为脚本类型作业,支持shell,python,perl等所有类型脚本。只需通过控制台或代码配置scriptCommandLine即可,无需编码。执行脚本路径可包含参数,参数传递完毕后,作业框架会自动追加最后一个参数为作业运行时信息


六、Zookeeper的作用

1、Elastic-Job依赖Zookeeper  任务信息的存储(任务名称、参与实例、任务执行策略等)

2、Elastic-Job依赖Zookeeper  实现选举机制,在任务执行实例数量变化时(启动新实例或停止实例),会触发选举机制来选举Leader,让其去执行该任务。

参考:Elastic-Job详细介绍

这篇关于Elastic-Job 分布式任务调度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836409

相关文章

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Redis分布式锁中Redission底层实现方式

《Redis分布式锁中Redission底层实现方式》Redission基于Redis原子操作和Lua脚本实现分布式锁,通过SETNX命令、看门狗续期、可重入机制及异常处理,确保锁的可靠性和一致性,是... 目录Redis分布式锁中Redission底层实现一、Redission分布式锁的基本使用二、Red

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动