ElasticJob入门->实现原理->源码分析
简介
Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供最轻量级的分布式任务的协调服务,外部依赖仅Zookeeper。
核心概念
1.分布式调度
Elastic-Job-Lite并无作业调度中心节点,而是基于部署作业框架的程序在到达相应时间点时各自触发调度。
注册中心仅用于作业注册和监控信息存储。而主作业节点仅用于处理分片和清理等功能。
2.作业高可用
Elastic-Job-Lite提供最安全的方式执行作业。将分片总数设置为1,并使用多于1台的服务器执行作业,作业将会以1主n从的方式执行。
一旦执行作业的服务器崩溃,等待执行的服务器将会在下次作业启动时替补执行。开启失效转移功能效果更好,可以保证在本次作业执行时崩溃,备机立即启动替补执行。
3.最大限度利用资源
Elastic-Job-Lite也提供最灵活的方式,最大限度的提高执行作业的吞吐量。将分片项设置为大于服务器的数量,最好是大于服务器倍数的数量,作业将会合理的利用分布式资源,动态的分配分片项。
例如:3台服务器,分成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.导入依赖
- 2.开发作业
- 3.作业配置
- 4.启动作业
作业开发
Elastic-Job提供Simple、Dataflow和Script 3种作业类型。 方法参数shardingContext包含作业配置、片和运行时信息。可通过getShardingTotalCount(), getShardingItem()等方法分别获取分片总数,运行在本作业服务器的分片序列号等。
- 具体实例参考我写的代码实例
部署运维平台
- 解压缩elastic-job-lite-console-${version}.tar.gz并执行bin\start.sh。
- 打开浏览器访问http://localhost:8899/即可访问控制台。8899为默认端口号,可通过启动脚本输入-p自定义端口号。
- 访问RESTFul API方法同控制台。
- elastic-job-lite-console-${version}.tar.gz可通过mvn install编译获取。
旧的job如何改造接入ElasticJob
分析久的job任务实现方式,套用新的ElasticJob
ElasticJob源码分析
启动
public static void main(String[] args) {
//创建定时任务配置信息
JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("MySimpleJob", "0 0/1 * * * ?", 1).build();
//使用简单任务包装上面创建的定时任务配置信息。除了SimpleJob还有两种定时任务类型
SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, MySimpleJob.class.getCanonicalName());
//定义Lite作业根配置
LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build();
//定义配置中心,zookeeper
CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", "elastic-job-demo"));
regCenter.init();
//将所有信息整合到JobScheduler
new JobScheduler(regCenter,simpleJobRootConfig).init();
}
JobCoreConfiguration类记录了作业的基本配置数据,采用了设计模式中的构建模式通过内部类Builder创建。作业的核心数据有:
private final String jobName;
private final String cron;
private final int shardingTotalCount;
private final String shardingItemParameters;
private final String jobParameter; //作业执行的参数
private final boolean failover; //是否开启失效转移
private final boolean misfire;
private final String description;
private final JobProperties jobProperties; //作业配置参数
JobScheduler核心的调度类
private JobScheduler(final CoordinatorRegistryCenter regCenter, final LiteJobConfiguration liteJobConfig, final JobEventBus jobEventBus, final ElasticJobListener... elasticJobListeners) {
//job Name和job的实例放到Map里面 单例模式,意味着,多个任务都会放在Map里面
//JobInstance实例仅仅只有一个Job的实例的名字
JobRegistry.getInstance().addJobInstance(liteJobConfig.getJobName(), new JobInstance());
this.liteJobConfig = liteJobConfig;
this.regCenter = regCenter;
//可以在任务执行完毕后做一下处理。可以自定义一些job的监听
List<ElasticJobListener> elasticJobListenerList = Arrays.asList(elasticJobListeners);
setGuaranteeServiceForElasticJobListeners(regCenter, elasticJobListenerList);
//门面模式:提供一个facade类,facade里面持有各种子系统的实例,对外提供统一的方法操作子系统的实例
//SchedulerFacade持有Elastic job里面创建的所有实例。提供的方法主要是操作zookeeper来重启任务,暂停任务,更新配置
schedulerFacade = new SchedulerFacade(regCenter, liteJobConfig.getJobName(), elasticJobListenerList);
//同样采用门面模式,facade持有任务的注册中,
jobFacade = new LiteJobFacade(regCenter, liteJobConfig.getJobName(), Arra