专栏首页GoLang那点事elastic-job-lite入门以及架构原理分析

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是以zookeeper作为注册中心的,console作为控制台和服务端解构,直接操纵zk改变job的配置信息,服务端启动时连接zk,注册job,初始化Scheuler,进行leader选举,分片,然后按照job配置信息调度作业,支持作业执行中的监控,event发送,失败转移等

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

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

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启动流程

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

elastic-job-lite优缺点

  • 从上面的分析我想大家已经能得出一些elastic-job-lite的一些利弊信息了,这里我在归纳总结一下,大家结合自己的业务去使用。 优点
    • 轻量级,简单,依赖少,只需一个zk就可以使用起来
    • 支持多种作业类型,分片,失效转移,错过执行,动态新增,删除节点
    • 简单的可视化管理
    • 方便和spring整合,springboot整合

缺点

  • 占用业务机器资源,资源调度和业务执行没有解耦
  • zk作为注册中心不友好,不支持高可用
  • 不支持复杂的作业管理(作业依赖),一些复杂业务场景不可使用
  • 可视化相对简单,作业监控也比较简单
  • 对单次执行不太友好

结束语

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

如果有收获,辛苦关注一下,点个赞呗

本文分享自微信公众号 - GoLang那点事(aweiaichitudou)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

推荐阅读

  • kubernetes系列教程(十九)使用metric-server让HPA弹性伸缩愉快运行

    kubernetes监控指标大体可以分为两类:核心监控指标和自定义指标,核心监控指标是kubernetes内置稳定可靠监控指标,早期由heapster完成,现由metric-server实现;自定义指标用于实现核心指标的扩展,能够提供更丰富的指标支持,如应用状态指标,自定义指标需要通过Aggregator和k8s api集成,当前主流通过promethues实现。

    HappyLau谈云计算
    Kubernetes容器微服务微服务架构腾讯微服务平台 TFS
  • 三分钟入坑指北 🔜 Docsify + Serverless Framework 快速创建个人博客系统

    之前由于学摄影的关系,为了提高自己的审美,顺便锻炼下自己的英文能力,翻译了不少国外艺术类的 文章。最近一直想搭一个个人博客来存放这些内容,又懒得折腾建站,遂一直搁置。

    Aceyclee
    ServerlessHTML网站GitGitHub
  • NVM作为主存上对数据库管理系统的影响

    implications of non-volatile memory as primary storage for database management systems

    yzsDBA
    存储缓存数据库数据结构SQL
  • DevOps平台架构演进

    附最新架构图https://www.processon.com/view/5cbd897de4b0bab90962c435

    我思故我在
    DevOps 解决方案微服务架构架构设计
  • 【腾讯云AI小程序大赛】中山大学作品《小耳朵天使》

    ----------------------------------------------------------------------------------

    陈华山
    小程序 · 云开发小程序语音识别文字识别对话机器人
  • Kona JDK 在腾讯大数据领域内的实践与发展

    经常听人谈到 OpenJDK,那它到底是什么呢?相信大家都听说过 Java SE、ME、EE等规范, 通常意义上对 Open JDK 的定义指:Java SE规范的一个免费和开源参考实现。

    腾小云
    JDKJavaJVM大数据Oracle
  • 公告丨腾讯安全产品更名通知

    为了更好地为政企客户的安全保驾护航,腾讯安全即日起更新旗下身份安全、网络安全、终端安全、应用安全、数据安全、业务安全、安全管理、安全服务等八类安全产品的命名,致力于打造全栈安全产品“货架”,让客户选购安全产品/服务更加便捷,更快地找到合适的安全产品,从而对自身的安全建设“对症下药”。

    腾讯安全
    DDoS 防护应用安全 MS验证码(业务安全)应用安全(移动安全)漏洞扫描服务
  • Kubernetes系列学习文章 - 网络实现(八)

    | 导语 前面介绍了很多K8S的概念以及架构方面的东西,这里我们说说K8S的网络。云计算里面的网络向来是复杂的,因为里面牵扯到硬件网络跟虚拟网络的交互。尤其是虚拟网络,比较抽象,如果不搞清楚,一些问题排障将寸步难行。

    宝哥@devops运维
    KubernetesDocker容器
  • 远程办公经验为0,如何将日常工作平滑过度到线上?

    导语 | 受到疫情影响,很多企业开始考虑远程办公。近日,TVP群里的各位老师们对此话题展开了热烈讨论。TVP张善友老师作为一名创业者,也决定开启远程办公。本文是他做了调研、试用后所总结的方案,并列出了相关产品清单,希望对读者有所帮助。文末也对各位TVP老师的相关语录进行了整理。「TVP思享」专栏,凝结大咖思考,汇聚专家分享,收获全新思想,欢迎长期关注。(编辑:云加社区 尾尾)

    尾尾
    TAPD 敏捷项目管理腾讯乐享企业邮箱企业编程算法
  • FFmpeg图像处理深度应用

    感谢大家关注FFmpeg在OnVideo以及AI方面的一些工作,我是刘歧,是OnVideo联合创始人的同时也担任技术负责人,同时也是FFmpeg的官方顾问,FFmpeg GSoC 2019 Mentor,FFmpeg决策委员会的委员,以及腾讯云TVP。我主要的兴趣在嵌入式开发、图形图像及音视频流媒体处理、分布式系统设计等领域。FFmpeg官方有我的联系方式,大家有问题可以和我随时交流。关于FFmpeg深度学习场景下的应用,目前看来,颇具价值且实用。

    LiveVideoStack
    视频处理图像处理OpenGLAPIOpenCV

扫码关注云+社区

领取腾讯云代金券