使用elastic job管理调度定时任务

使用elastic job管理调度定时任务

elastic-job

elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案 , 由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。

去中心化

elastic-job是去中心化设计,作业调度中心节点,各个作业节点是自治的,作业框架的程序在到达相应时间点时各自触发调度,缺点是可能会存在各个作业服务器的时间不一致的问题。
概念:去中心化,不是不要中心,而是由节点来自由选择中心、自由决定中心。简略地说,中心化的意思,是中心决定节点。节点有必要依靠中心,节点离开了中心就无法生计。在去中心化体系中,任何人都是一个节点,任何人也都能够成为一个中心。任何中心都不是永久的,而是阶段性的,任何中心对节点都不具有强制性。

一、主要的功能

1、定时任务:基于成熟的定时任务作业框架Quartz cron表达式执行定时任务;2、作业注册中心:基于Zookeeper和其客户端Curator实现的全局作业注册控制中心;作业注册中心仅用于作业任务注册和监控信息的暂存;3、定时任务分片:可以将原本一个较大任务分片成为多小的子任务项分别在多个服务器上同时执行,提高总任务的执行处理效率;4、弹性扩容缩容:运行中定时任务所在的服务器崩溃,或新增加n台作业服务器,作业框架将在下次任务执行前重新进行任务调度分发,不影响当前任务的处理与执行;5、支持多种任务模式:分别支持Simple、Dataflow和Script类型的定时任务;6、失效转移:运行中的定时任务所在的服务器崩溃不会导致重新分片,会在下次定时任务启动时重新分发和调度;7、运行时定时任务状态收集:监控任务运行时的状态,统计最近一段时间任务处理成功和失败的数量,记录作业上次运行开始时间,结束时间和下次运行时间;8、支持配置定时任务停止、恢复和禁用:用于操作定时任务的启停,并可以禁止某任务的执行;9、Spring支持:Elastic-Job-Lite项目完美支持spring的容器,自定义命名空间,支持占位符10、运维平台:提供运维界面,方便开发和运维人员管理生产环境上已经发布的定时任务和注册中心;

二、三种任务类型

Simple类型作业
实现SimpleJob接口,用于执行普通的定时任务,增加了弹性拓容和分片等功能
Simple类型通过执行execute方法,方法入参会携带分片参数决定当前机器处理那些分片的数据
Dataflow类型作业
Dataflow类型用于处理数据流,需实现DataflowJob接口。该接口提供2个方法可供覆盖,分别用于抓取(fetchData)和处理(processData)数据。
需要注意一点流式作业如果数据不为空会一直跑

scriptJob类型的作业

脚本作业是用来定时调度脚本文件
Script类型是通过触发一个脚本来执行脚本中的业务逻辑,这个脚本可以是window下的.exe文件,也可以是python等文件

三、分片的用法

分片的目的就是通过配置分片个数,让不同的分片参数到不同的服务中去,比如配置了分片个数是2,那么分片一会到服务一中,分片二到服务二中

四、事件追踪(将任务的执行信息保存到mysql中,会自动创建表)

五、实现原理
弹性分布式实现
第一台服务器上线触发主服务器选举。主服务器一旦下线,则重新触发选举,选举过程中阻塞,只有主服务器选举完成,才会执行其他任务。
某作业服务器上线时会自动将服务器信息注册到注册中心,下线时会自动更新服务器状态。
主节点选举,服务器上下线,分片总数变更均更新重新分片标记。
定时任务触发时,如需重新分片,则通过主服务器分片,分片过程中阻塞,分片结束后才可执行任务。如分片过程中主服务器下线,则先选举主服务器,再分片。
通过上一项说明可知,为了维持作业运行时的稳定性,运行过程中只会标记分片状态,不会重新分片。分片仅可能发生在下次任务触发前。
每次分片都会按服务器IP排序,保证分片结果不会产生较大波动。
实现失效转移功能,在某台服务器执行完毕后主动抓取未分配的分片,并且在某台服务器下线后主动寻找可用的服务器执行任务。
注册中心数据结构
注册中心在定义的命名空间下,创建作业名称节点,用于区分不同作业,所以作业一旦创建则不能修改作业名称,如果修改名称将视为新的作业。

六、遇到的问题

1、 配置类中配置bean的时候,方法名不要重复,否则会发现任务不跑,
2、 脚本任务不用新建实例
3、 两种配置方式
Xml 配置 和yml配置
参数:
failover:是否开启任务执行失效转移,开启表示如果作业在一次任务执行中途宕机,允许将该次未完成的任务在另一作业节点上 补偿执行 description:作业描述 overwrite:本地配置是否可覆盖注册中心配置,如果可覆盖,每次启动作业都以本地配置为准
注:
运维平台和elastic-job并无直接关系,是通过读取作业注册中心数据展现作业状态,或更新注册中心数据修改全局配置。
控制台只能控制作业本身是否运行,但不能控制作业进程的启停,因为控制台和作业本身服务器是完全分布式的,控制台并不能控制作业服务器

你可能感兴趣的:(分布式任务调度)