概述
ElasticJob是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。
Elastic-job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供轻量级的协调服务,外部依赖Zookeeper。
功能列表
- 分布式调度协调
- 弹性扩容缩容
- 失效转移
- 错过执行作业重触发
- 作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
- 自诊断并修复分布式不稳定造成的问题
- 支持并行调度
- 支持作业生命周期操作
- 丰富的作业类型
- Spring整合以及命名空间提供
- 运维平台
基本概念
分片概念
任务的分片执行,将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行其中某一个或几个分片项。
分片项与业务处理解耦
Elastic-job不直接提供数据处理的功能,框架会将分片项分配至各个运行中的服务器,开发者需要自行处理分片项与真实数据的对应关系。
个性化参数的使用场景
个性化参数即shardingItemParameter,可以和分片项匹配对应关系,用于将分片项的数字转换为更加可读的业务代码。 类似一种映射关系,比如0映射“北京”,1映射“上海”,2映射“广州”等。
核心理念
分布式调度
Elastic-Job-Lite并无作业调度中心节点,而是基于部署作业框架的程序在达到相应时间点各自触发调度。 注册中心仅用于作业注册和监控信息存储,而主作业节点仅用于处理分片和清理等功能。
作业高可用
Elastic-Job-Lite 提供安全的方式执行作业,将分片总数设置为1,并使用多于1台的服务器执行作业,作业将会以1主n从的方式执行。
最大限度利用资源
Elastic-Job-Lite将最大限度提高作业的吞吐量,将分片项设置为大于服务器的数量,最好是大于服务器倍数的数量,作业将会合理的利用资源,动态的分配分片项。
3台服务器(A,B,C),分成10片,则分片项分配结果为服务器A=0,1,2,服务器B=3,4,5,服务器C=6,7,8,9。如果服务器C突然崩溃,那么分片项分配结果为服务器A=0,1,2,3,4,服务器B=5,6,7,8,9。在不丢失分片项的情况下,最大限度利用现有资源提高吞吐量。
整体架构图
快速入门
1.使用API配置启动
引入Maven依赖
<dependency>
<groupId>io.elasticjob</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
作业开发
public class MyElasticJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
System.out.println("MyElasticJob shardingItem======="+shardingContext.getShardingItem()+", ShardingContext===="+ JSON.toJSONString(shardingContext));
}
}
相关配置并启动作业
public class MyElasticJobManager {
public static void main(String[] args) {
new JobScheduler(createRegistryCenter(),createJobConfiguration()).init();
}
/**
* 创建注册中心
* @return
*/
private static CoordinatorRegistryCenter createRegistryCenter(){
CoordinatorRegistryCenter registryCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration("127.0.0.1:2181","my-elastic-job-demo"));
registryCenter.init();
return registryCenter;
}
/**
* 作业配置
* @return
*/
private static LiteJobConfiguration createJobConfiguration(){
//定义作业核心配置
JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("demoSimpleJob","0/15 * * * * ?",10).build();
//定义Simple类型配置
SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(simpleCoreConfig,MyElasticJob.class.getCanonicalName());
//定义Lite作业根配置
return LiteJobConfiguration.newBuilder(simpleJobConfiguration).build();
}
}
启动1个任务时
启动2个任务时,自动做了分片
对应ZK上节点概览
2.使用Spring配置启动
引入maven依赖
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.0.5</version>
</dependency>