elastic-job-lite 入门以及架构原理分析

elastic-job-lite简介

  • elastic-job是当当网开源的分布式任务调度系统,基于quartz二次开发实现的,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。

  • 前者主要定位为轻量级,去中心化的的分布式任务调度解决方案,是以jar包的形式提供,后者采用自研Mesos Framework的解决方案,额外提供资源治理、应用分发以及进程隔离等功能,

  • 我们今天主要说的是elastic-job-lite,cloud放在下一期讲解,目前最新版本是3.0.0.M1-SNAPSHOT,已经停止更新了

  • 但是使用的人,公司和教程还是很多的,遇到问题基本通过搜索可以解决的,解决不了的可以研究源码(还是相对比较好理解的)可以放心的使用。

    elastic-job-lite架构

  • elastic-job-lite轻量级的,去中心化的,上面说过他是基于quartz的,所以他的调度由使用其jar的项目驱动的,引入了zookeeper和分片的概念的为多台机器调度提供了协调和并行,并且配备一个运维端来管理job

  • elastic-job-lite架构图
    elastic-job-lite入门以及架构原理分析

  • 从上图我们可以看出,elastic-job-lite是以zookeeper作为注册中心的,console作为控制台和服务端解构,直接操纵zk改变job的配置信息,服务端启动时连接zk,注册job,初始化Scheuler,进行leader选举,分片,然后按照job配置信息调度作业,支持作业执行中的监控,event发送,失败转移等

  • elastic-job-lite部署图
    elastic-job-lite入门以及架构原理分析

  • elastic-web控制台部署一台机器(也只能部署一台,有点坑),原因是elsatic-web通过界面添加zk的地址,写入本台机器文件中,这是有状态的,如果部署多台,负载均衡后,你再页面看到的信息多次访问后会不一致,因为会调用到不同的机器上,看下面的图,就理解了,如果想要多台做负载均衡,做HA,需要对这块做二次开发。(一般小公司一台足够了,web没什么压力)

elastic-job-lite入门以及架构原理分析

elastic-job-lite使用

elastic-job-lite 入门使用

  • 首先准备好zk集群,elastic-job-lite使用zk作为注册中心
  • 在自己的项目中引入maven依赖
<dependency> 
    <groupId>com.dangdang</groupId> 
    <artifactId>elastic-job-lite-core</artifactId> 
    <version>3.0.0.M1-SNAPSHOT</version> 
</dependency>
  • elastic-job-lite支持两种作业类型,我们可以根据自己的业务需求选择合适作业类型
    • io.elasticjob.lite.api.simple.SimpleJob 实现此接口代表这个作业时简单累型作业
    • io.elasticjob.lite.api.dataflow.DataflowJob 实现此接口代表这个作业是支持流处理的作业
    • io.elasticjob.lite.api.script.ScriptJob 实现此接口代表这个作业是一个脚本作业
//简单作业类型
public class MyElasticJob implements SimpleJob { 
    @Override 
    public void execute(ShardingContext context) { 

    } 
}

简单作业类型我们实现SimpleJob接口中的execute方法,在里面处理自己的业务需求,调度器通过配置的cron表达式进行调度。

//流处理作业类型
public class MyElasticJob implements DataflowJob<T> {    
    //抓取数据
    @Override    
    public List<T> fetchData(ShardingContext shardingContext) {    
        return null;
    }        
    //执行数据
    @Override   
    public void processData(ShardingContext shardingContext, List<T> list){
    {        
}

流处理作业,需要实现DataflowJob中的两个方法(fetchData,processData),第一个方法负责抓取数据,抓取之后交给第二个方法执行。

//脚本作业
public class MyElasticJob implements ScriptJob {    
}

elastic-job-lite三种作业的配置相关

  • elastic-job-lite作业配置的类图是这样的
    elastic-job-lite入门以及架构原理分析

  • 我们分析上面类图:

    • JobCoreConfiguration类定义了job作业核心配置属性
    • JobTypeConfiguration, Job类型的配置接口,有三个实现类,对应上面三种类型的作业,JobTypeConfiguration接口定义了获取JobCoreConfiguration类的方法
    • JobRootConfiguration, Job跟配置接口,定义了获取JobTypeConfiguration实现类的方法
    • LiteJobConfiguration类实现了JobRootConfiguration接口
  • 接下来我们分析这写类中定义的job配置属性

属性 所属类 描述 简单 流处理 脚本
jobName JobCoreConfiguration 名称
cron JobCoreConfiguration 时间表达式
shardingTotalCount JobCoreConfiguration 任务分片的总数
shardingItemParameters JobCoreConfiguration 每个分片对应的参数
jobParameter JobCoreConfiguration job从外部传入的参数
failover JobCoreConfiguration 是否开启失效转移
misfire JobCoreConfiguration 是否开启错过执行
description JobCoreConfiguration 任务描述
jobProperties JobCoreConfiguration 任务的一些属性配置
monitorExecution LiteJobConfiguration 是否开启监控
maxTimeDiffSeconds LiteJobConfiguration 本机和注册中心最大时间误差数
moinitorPort LiteJobConfiguration 监控u的那口
jobShardingStrategyClass LiteJobConfiguration 分片策略类
disabled LiteJobConfiguration 设置作业是否启动时禁止
overwrite LiteJobConfiguration 是否重写配置
streamingProcess DataflowJobConfiguration 是否开启流执行
scriptCommandLine ScriptJobConfiguration 脚本命令行

elastic-job-lite任务执行架构图

elastic-job-lite入门以及架构原理分析

  • 在elastic-job-lite中,由调度器统一调度job,每种类型的job都对应一个调度器(目前调度器只有一种实现SpringJobScheduler),准备说是一个job对应一个scheduler,每种类型的job执行方法不一样,Simple类型通过执行execute方法,方法入参会携带分片参数决定当前机器处理那些分片的数据,DataFlow类型执行fetch方法,也是携带分片参数抓取属于当前机器处理的数据交给execute方法执行,Script类型是通过触发一个脚本来执行脚本中的业务逻辑,这个脚本可以是window下的.exe文件,也可以是python等文件

elastic-job-lite的作业执行流程图

elastic-job-lite入门以及架构原理分析

  • 上图详细描述elastic-job-lite中一个任务的执行流程,从quartz中一个job运行线程开始,调用LiteJob的execute方法,紧接着根据job的类型创建JobExecutor,开始执行jobExecutor,根据模板设计模式,父类AbstractExecutor规定了job的执行流程,子类重写了具体不同job类型执行时的同逻辑。
  • 描述一下各个方法的作用
    • checkJobExecutionEnvironment检查作业运行环境
    • getShardingContext获取作业的分片的上下文
    • postJobStatusTraceEvent发送作业状态跟踪时间
    • misfireRunning错过执行检查和设置
    • beforeJobExecuted作业执行前监听器执行
    • execute执行作业
    • isExecuteMisfired是否执行错过执行
    • failoverIfNecessary失效转移是否执行
    • afterJobExecuted作业执行后监听器执行

elastic-job-lite启动流程

elastic-job-lite入门以及架构原理分析

  • 首先启动连接注册中心k,并且进行初始化,创建zk客户端,接着作业调度器JobScheduler,执行调度器的init方法,在init方法中做如下事情
    • 往注册中心更新jobConfig
    • 创建job调取器控制中心
    • 注册job
    • 注册job启动信息
      • 开启关于job的zk监听器
      • 主节点选举
      • 持久化作业服务器上线信息
      • 持久化作业运行实例信息
      • 设置重新分片的标记
      • 初始化作业监听服务
      • 启动调解分布式作业不一致状态服务

elastic-job-lite优缺点

  • 从上面的分析我想大家已经能得出一些elastic-job-lite的一些利弊信息了,这里我在归纳总结一下
    • 优点
      • 轻量级,简单,依赖少,只需一个zk就可以使用起来
      • 支持多种作业类型,分片,失效转移,错过执行,动态新增,删除节点
      • 简单的可视化管理
      • 方便和spring整合,springboot整合
    • 缺点
      • 占用业务机器资源,资源调度和业务执行没有解耦
      • zk作为注册中心不友好,不支持高可用
      • 不支持复杂的作业管理(作业依赖),一些复杂业务场景不可使用
      • 可视化相对简单,作业监控也比较简单
      • 对单次执行不太友好

结束语

关于elastic-job-lite入门和原理就分享到这里了,其实上面的每一个点深入下去都可以单独写一篇文章了,后续会慢慢把这块再更新出来,希望帮助到大家,如果有收获,辛苦关注一下,点个赞呗。

欢迎大家关注微信公众号:“golang那点事”,更多精彩期待你的到来

elastic-job-lite入门以及架构原理分析

那小子阿伟

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!