恭喜你, 入门了 Elastic-Job 🚁
喂,阿珍啊,我是田鸡,这二十年来我一直有句话放在心里没有说,其实,我爱你
我不是阿珍,我是阿强
哦,阿强啊,那麻烦你把我刚才的话转告给你老婆
Elastic-Job 是一款基于 ZooKeeper 和 Quartz 实现的分布式任务调度框架,它提供了分片处理和分布式任务调度能力。
Elastic-Job | hello world
在 Spring Boot 中使用 Elastic-Job 非常简单,你可以按照以下步骤进行操作:
- 添加 Elastic-Job 的 Maven 依赖
在 pom.xml 文件中添加 Elastic-Job 的 Maven 依赖:
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring-boot-starter</artifactId>
<version>${elastic.job.version}</version>
</dependency>
其中 ${elastic.job.version}
是 Elastic-Job 的版本号。
- 配置 Elastic-Job
在 Spring Boot 的配置文件 application.yml
中添加 Elastic-Job 的相关配置:
spring:
elasticjob:
# ZK 地址,多个用逗号分隔
zk:
server-lists: localhost:2181
namespace: elastic-job-lite-springboot
lite:
# 最大时间误差秒数
max-time-diff-seconds: 10
# 作业监控端口
monitor-port: 9888
其中 zk.server-lists
表示 ZooKeeper 的地址,zk.namespace
表示 Elastic-Job 在 ZooKeeper 上的命名空间,lite
下的配置表示 Elastic-Job 的 Lite 配置。
还有两个比较重要的配置, 这里没用到
# 作业分片策略类全路径
job-sharding-strategy-class: com.xxx.MyShardingStrategy
# 作业执行器服务处理器类全路径
job-executor-service-handler-class: com.xxx.MyJobExecutorServiceHandler
- 编写 Elastic-Job 的作业类
@Component
public class MyJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
switch (shardingContext.getShardingItem()) {
case 0:
// do something by sharding item 0
break;
case 1:
// do something by sharding item 1
break;
case 2:
// do something by sharding item 2
break;
// case n:
// ...
}
}
}
其中 MyJob
实现了 Elastic-Job 的 SimpleJob
接口,execute
方法中的 ShardingContext
参数表示当前分片的上下文信息。
- 配置 Elastic-Job 的作业
@Configuration
public class ElasticJobConfig {
@Autowired
private ZookeeperRegistryCenter registryCenter;
@Autowired
private MyJob myJob;
@Bean(initMethod = "init")
public JobScheduler simpleJobScheduler() {
JobCoreConfiguration coreConfig = JobCoreConfiguration.newBuilder("myJob", "0/5 * * * * ?", 3)
.shardingItemParameters("0=a,1=b,2=c").build();
SimpleJobConfiguration jobConfig = new SimpleJobConfiguration(coreConfig, myJob.getClass().getName());
return new SpringJobScheduler(myJob, registryCenter, jobConfig);
}
}
其中 ZookeeperRegistryCenter
是 Elastic-Job 提供的 ZooKeeper 注册中心,MyJob
是上面编写的作业类,JobCoreConfiguration
是 Elastic-Job 的作业核心配置,包括作业名称、Cron 表达式、分片总数等信息,SimpleJobConfiguration
是简单作业配置,包括作业核心配置和作业类名,SpringJobScheduler
是 Spring 容器中的作业调度器。
- 测试 Elastic-Job 的作业
在 Spring Boot 的启动类中添加 @EnableElasticJob
注解开启 Elastic-Job 功能:
@SpringBootApplication
@EnableElasticJob
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
现在,你已经成功地配置了 Elastic-Job,并在 Spring Boot 中使用它进行时间调度了。当应用启动时,Elastic-Job 会自动启动作业,并按照配置的分片数进行分布式调度。
需要注意的是,在使用 Elastic-Job 进行时间调度时,需要预先搭建好 ZooKeeper 集群并保证其正常运行。同时,Elastic-Job 还提供了多种分片策略和作业类型供你选择,你可以根据实际需求进行配置。
配置模式 | Lite 配置 Spring 配置, YAML 配置
- Lite 配置
- 简介:Lite 配置是 Elastic-Job-Lite 模块中的一种配置方式,是一种轻量级的分布式任务调度框架。
- 特点:提供了丰富的作业配置选项,配置简单,易于上手。
- 使用场景:适用于对功能需求不是很复杂、配置较为简单的场景。
- Spring 配置
- 简介:Spring 配置是指在 Spring 框架中使用 Elastic-Job 的配置方式,提供了更加灵活和强大的作业配置和管理功能。
- 特点:灵活性和可扩展性强,使用 Spring 的依赖注入和 AOP 等功能来管理 Elastic-Job 作业的各种配置和调度操作。
- 使用场景:适用于对功能需求比较复杂、需要进行一定程度的定制化开发的场景。
- YAML 配置
- 简介:YAML 配置是 Elastic-Job 提供的一种轻量级的配置方式,是一种类似于 JSON 的轻量级配置格式。
- 特点:配置简单、易读,可快速创建和管理 Elastic-Job 作业。
- 使用场景:适用于对功能需求不是很复杂、但是需要使用配置文件进行管理的场景。
需要根据实际需求和技术水平进行选择。
Lite 配置
在 Elastic-Job 中,Lite 配置是一个非常重要的配置项,它包含了作业执行器、作业分片、任务调度等关键参数的配置。Lite 配置被设计为通用的配置,可以应用于所有类型的作业。
具体来说,Lite 配置包含了以下几个重要的参数:
-
max-time-diff-seconds
:最大时间误差秒数,用于控制作业服务器和注册中心的时间误差在可接受的范围内,避免任务因时间误差而重复执行或未执行。 -
monitor-port
:作业监控端口,用于启动作业监控器,通过 HTTP 协议提供作业状态和统计信息。 -
job-sharding-strategy-class
:作业分片策略类全路径,用于决定作业分片的方式,可以根据自己的需求编写分片策略。 -
job-executor-service-handler-class
:作业执行器类全路径,用于决定作业执行的方式,可以根据自己的需求编写执行器。
Lite 配置的主要作用是为作业的运行提供关键参数的配置,同时还提供了作业分片和执行器的自定义接口,可以根据实际需求进行灵活配置。
需要注意的是,Elastic-Job 的 Lite 配置仅适用于轻量级作业(Lite Job),对于流式作业(Streaming Job)和数据流作业(Dataflow Job),需要使用不同的配置方式。
public class MyJobConfiguration implements LiteJobConfiguration {
private final JobCoreConfiguration coreConfig;
private final SimpleJobConfiguration jobConfig;
public MyJobConfiguration(final JobCoreConfiguration coreConfig, final SimpleJobConfiguration jobConfig) {
this.coreConfig = coreConfig;
this.jobConfig = jobConfig;
}
@Override
public JobTypeConfiguration getTypeConfig() {
return jobConfig;
}
@Override
public JobCoreConfiguration getCoreConfig() {
return coreConfig;
}
@Override
public String toString() {
return String.format("MyJobConfiguration(coreConfig=%s, jobConfig=%s)", coreConfig, jobConfig);
}
}
public class MyJob {
public static void main(final String[] args) throws IOException {
// 创建 ZooKeeper 配置
ZookeeperConfiguration zkConfig = new ZookeeperConfiguration("localhost:2181", "elasticjob-lite-java-api-demo");
// 创建作业核心配置
JobCoreConfiguration coreConfig = JobCoreConfiguration.newBuilder("mySimpleJob", "0/10 * * * * ?", 3)
.shardingItemParameters("0=A,1=B,2=C")
.failover(true)
.misfire(true)
.description("我的简单作业")
.build();
// 创建简单作业配置
SimpleJobConfiguration jobConfig = new SimpleJobConfiguration(coreConfig, MySimpleJob.class.getCanonicalName());
// 创建 Lite 作业配置
LiteJobConfiguration liteJobConfig = new MyJobConfiguration(coreConfig, jobConfig);
// 使用 LiteJobConfiguration 对象创建作业调度器
new SpringJobScheduler(new MySimpleJob(), zkConfig, liteJobConfig).init();
// 防止进程退出
System.in.read();
}
}
在上面的示例中,我们使用 Elastic-Job Lite 的 Java API 配置方式,创建了一个简单作业调度器,并指定了作业名称、Cron 表达式、作业分片总数、分片序列号和参数对照表、作业执行处理类、作业类型等各种配置选项。需要注意的是,我们需要创建 MyJobConfiguration 和 MySimpleJob 两个类来实现作业配置和作业处理逻辑。
Spring 配置
除了 Lite 配置之外,Elastic-Job 还提供了一种名为 Spring 配置的重量级配置方式。Spring 配置是指在 Spring 框架中使用 Elastic-Job 的配置方式,它提供了更加灵活和强大的作业配置和管理功能,同时也更加复杂和繁琐。
在 Spring 配置中,可以使用 Spring 的依赖注入和 AOP 等功能来管理 Elastic-Job 作业的各种配置和调度操作。例如,在 Spring 配置中,可以使用 @ElasticJobConf
注解来定义作业配置,使用 @ElasticSimpleJob
、@ElasticDataflowJob
和 @ElasticStreamingJob
等注解来定义不同类型的作业类,使用 @ElasticJobScheduler
注解来定义作业调度器等。同时,还可以使用 Spring 提供的各种配置选项和调度规则来定制 Elastic-Job 作业的各种属性,例如作业名称、作业类型、Cron 表达式、分片数、执行器等等。
需要注意的是,Spring 配置相对于 Lite 配置而言,具有更高的灵活性和可扩展性,但同时也更加复杂和繁琐,需要有一定的 Spring 框架使用经验和技能。在实际应用中,需要根据实际需求和技术水平进行选择。
YAML 配置
除了 Lite 配置和 Spring 配置之外,Elastic-Job 还提供了一种名为 YAML 配置的配置方式。YAML 配置是一种类似于 JSON 的轻量级配置格式,它提供了一种简洁、易读的配置方式,可以快速地创建和管理 Elastic-Job 作业。
在 YAML 配置中,可以通过 spring.elasticjob
配置属性来设置 Elastic-Job 的各种配置选项和调度规则,例如:
spring:
elasticjob:
# ZK 地址,多个用逗号分隔
zk:
server-lists: localhost:2181
namespace: elastic-job-lite-springboot
lite:
# 每次处理任务的数量
max-time-diff-seconds: 10
# 作业启动后的初始化延迟时间
monitor-port: 9888
# 作业分片策略类全路径
job-sharding-strategy-class: com.xxx.MyShardingStrategy
# 作业执行器类全路径
job-executor-service-handler-class: com.xxx.MyJobExecutorServiceHandler
在上面的配置中,我们使用了 spring.elasticjob.zk
和 spring.elasticjob.lite
两个属性来设置 Elastic-Job 的 ZooKeeper 地址和 Lite 配置参数。具体的配置选项和调度规则可以参考 Elastic-Job 官方文档进行设置。
需要注意的是,YAML 配置相对于 Lite 配置和 Spring 配置而言,具有更高的简洁性和易读性,同时也更加轻量级和灵活。但是,YAML 配置相对于 Spring 配置而言,可能会存在一些限制和不足,例如不支持 Spring AOP 和依赖注入等功能。在实际应用中,需要根据实际需求和技术水平进行选择。
分片策略
Elastic-Job 的分片策略是指如何将作业分成多个分片并在分布式环境下进行分片调度的策略。在 Elastic-Job 中,提供了多种不同类型的分片策略,具体如下:
-
平均分配策略(AverageAllocationJobShardingStrategy):将作业分片平均分配给所有可用的作业执行器。
-
最小化差异策略(MinAvailableJobShardingStrategy):将作业分片分配给当前可用分片数最小的作业执行器。
-
标签分配策略(TaggedJobShardingStrategy):将作业分片根据作业执行器的标签进行分配,相同标签的作业执行器会分到同一组。
-
随机分配策略(RandomJobShardingStrategy):将作业分片随机分配给作业执行器。
-
Odevity 扩展分片策略(OdevityJobShardingStrategy):将作业分片按照优先级进行排序,优先级高的分片先分配给作业执行器。
-
原 IP Hash 分配策略(IpPrefixJobShardingStrategy):将作业分片根据作业执行器的 IP 地址前缀进行分配,相同 IP 地址前缀的作业执行器会分到同一组。
需要根据实际需求选择合适的分片策略。默认的分片策略是平均分配策略。
作业类型
Elastic-Job 支持三种作业类型,分别是简单作业(Simple Job)、流式作业(Streaming Job)和数据流作业(Dataflow Job)。
- 简单作业(Simple Job)
简单作业是 Elastic-Job 中最基础的一种作业类型,每次执行作业时,作业处理逻辑都会在单个线程中依次执行,适合于处理短时任务或不需要分片的任务。
- 流式作业(Streaming Job)
流式作业是一种可以处理数据流的分布式作业,它将数据分为多个分片进行处理,并支持自动缩容和扩容。在流式作业中,分片可以看作数据流的分段,每个分片可以独立地处理数据,不同分片之间并不相互影响。
- 数据流作业(Dataflow Job)
数据流作业是 Elastic-Job 中另一种支持数据流处理的分布式作业,它与流式作业类似,但它的分片处理方式不同,分片之间可以相互影响。在数据流作业中,每个分片都会接收到上一个分片处理的数据,分片之间可以进行数据交换和传递。这种作业类型适用于处理具有依赖关系的数据流。
以上三种作业类型都可以通过 Elastic-Job 提供的 API 进行编写和管理。在选择作业类型时,需要根据实际业务场景进行判断和选择,以保证作业的高效和稳定运行。
数据流作业
在Elastic-Job中,数据流作业(DataflowJob)是一种特殊类型的作业,它用于处理数据流类型的任务,如数据清洗、数据同步等。数据流作业通常包含两个阶段:抓取数据(fetch data)和处理数据(process data)。下面给出一个简单的数据流作业的示例:
- 首先,实现
DataflowJob
接口,并重写fetchData
和processData
方法。
import com.dangdang.ddframe.job.api.dataflow.DataflowJob;
import com.dangdang.ddframe.job.api.dataflow.DataflowJobExecutionContext;
import java.util.List;
public class MyDataflowJob implements DataflowJob<String> {
@Override
public List<String> fetchData(DataflowJobExecutionContext context) {
// 抓取数据
// 这里可以通过数据库查询、API调用等方式抓取数据。
// 在本示例中,我们简单地创建一个字符串列表作为数据。
List<String> data = Arrays.asList("data1", "data2", "data3");
return data;
}
@Override
public void processData(DataflowJobExecutionContext context, List<String> data) {
// 处理数据
// 在这里实现数据的处理逻辑。例如,对数据进行清洗、转换、存储等操作。
for (String item : data) {
System.out.println("Processing: " + item);
}
}
}
- 接下来,创建作业配置。对于数据流作业,我们需要使用
DataflowJobConfiguration
。
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration;
import com.dangdang.ddframe.job.executor.ShardingContexts;
public class MyDataflowJobConfig {
public static void main(String[] args) {
// 配置作业核心配置
JobCoreConfiguration coreConfig = JobCoreConfiguration.newBuilder("myDataflowJob", "0/30 * * * * ?", 3)
.shardingItemParameters("0=A,1=B,2=C")
.build();
// 配置数据流作业配置
DataflowJobConfiguration dataflowJobConfig = new DataflowJobConfiguration(coreConfig, MyDataflowJob.class.getCanonicalName(), true);
// 注册作业
// 在这里使用Elastic-Job的API注册作业到注册中心。
}
}
在这个示例中,我们创建了一个简单的数据流作业MyDataflowJob
。该作业首先通过fetchData
方法抓取数据,然后通过processData
方法处理数据。在实际应用中,您可以根据实际业务需求编写相应的数据抓取和处理逻辑。
注意:Elastic-Job 3.x版本开始,已将数据流作业的概念修改为流式作业(流式处理),即StreamJob
。但在概念上,它们都是用于处理数据流类型的任务。您可以根据所使用的Elastic-Job版本进行相应的调整。