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、引入依赖

XML 复制代码
<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配置

java 复制代码
elastic-job.zookeeper.nameSpace=项目名称

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

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

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

XML 复制代码
<job:simple
    id="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启动,任务将自动加载

java 复制代码
@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不允许执行过程中重新分片,下次任务启动之前才能 重新分片,所以 有服务宕机则未执行完成的任务只能下次任务启动再执行。开启失效转移 可以尽快执行。

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

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

java 复制代码
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详细介绍

相关推荐
武子康1 小时前
Java-71 深入浅出 RPC Dubbo 上手 父工程配置编写 附详细POM与代码
java·分布式·程序人生·spring·微服务·rpc·dubbo
武子康3 小时前
Java-72 深入浅出 RPC Dubbo 上手 生产者模块详解
java·spring boot·分布式·后端·rpc·dubbo·nio
橘子在努力6 小时前
【橘子分布式】Thrift RPC(理论篇)
分布式·网络协议·rpc
lifallen8 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
沈健_算法小生11 小时前
基于SpringBoot3集成Kafka集群
分布式·kafka·linq
Swift社区12 小时前
ELK、Loki、Kafka 三种日志告警联动方案全解析(附实战 Demo)
分布式·elk·kafka
chanalbert20 小时前
Nacos 技术研究文档(基于 Nacos 3)
spring boot·分布式·spring cloud
线条11 天前
Spark 单机模式安装与测试全攻略
大数据·分布式·spark
C182981825751 天前
分布式ID 与自增区别
分布式
码字的字节1 天前
深入解析Hadoop架构设计:原理、组件与应用
大数据·hadoop·分布式·hadoop架构设计