一、为什么要用elastic-job
1、如何解决多节点部署下,保证job不被重复执行,数据正确?(可以采用分布式锁来调度,难度比较大) 2、如何解决类似job是跑大表数据,需要很长时间的才跑完并保证数据的正确性?
3、如何解决线上job未执行,如何根据实际情况手动触发job执行?4、还有例如对job执行结果监听,对job的监控等等?
二、elastic-job是什么
1、简介
Elastic-Job是一个分布式调度解决方案, 由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务,Elastic-Job-Lite 定位为纯粹的作业中间件,仅关注分布式调度、协调以及分片等核心功能。
简单的说:Elastic-Job是当当网大牛基于Zookepper,Quartz开发并且开源的Java分布式定时任务,解决Quartz不支持分布式的弊端。
官网地址:http://elasticjob.io/ 项目的开源地址:https://github.com/elasticjob
2、功能
1、定时任务:基于成熟的定时任务作业框架 Quartz cron 表达式执行定时任务。2、作业注册中心:基于 Zookeeper 和其客户端 Curator 实现的全局作业注册控制中心。用于注册,控制和协调分布式作业执行。
3、作业分片:将一个任务分片成为多个小任务项在多服务器上同时执行。
4、弹性扩容缩容:运行中的作业服务器崩溃,或新增加 n 台作业服务器,作业框架将在下次作业执行前重新分片,不影响当前作业执行。
5、支持多种作业执行模式:支持 Simple、Dataflow、脚本三种作业类型。
6、失效转移:运行中的作业服务器崩溃不会导致重新分片,只会在下次作业启动时分片。启用失效转移功能可以在本次作业执行过程中,监测其他作业服务器空闲,抓取未完成的分片项执行。
7、运行时状态收集:监控作业运行时状态,统计最近一段时间处理的数据成功和失败数量,记录作业上次运行开始时间,结束时间和下次运行时间。
8、作业停止,恢复和禁用:用于操作作业启停,并可以禁止某作业运行(上线时常用)。被错过执行的作业重触发:自动记录错过执行的作业,并在上次作业完成后自动触发。可参考 Quartz 的 misfire。
9、多线程快速处理数据:使用多线程处理抓取到的数据,提升吞吐量。
10、幂等性:重复作业任务项判定,不重复执行已运行的作业任务项。由于开启幂等性需要监听作业运行状态,对瞬时反复运行的作业对性能有较大影响。
11、容错处理:作业服务器与 Zookeeper 服务器通信失败则立即停止作业运行,防止作业注册中心将失效的分片项分配给其他作业服务器,而当前作业服务器仍在执行任务,导致重复执行。
12、Spring 支持:支持 spring 容器,自定义命名空间,支持占位符。
13、运维平台:提供运维界面,可以管理作业和注册中心。
2.1、 分片特性
1、任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。例如:有一个遍历数据库某张表的作业,现有2台服务器。为了快速的执行作业,那么每台服务器应执行作业的50%。为满足此需求,可将作业分成2片,每台服务器执行1片。作业遍历数据的逻辑应为:服务器A遍历ID以奇数结尾的数据;服务器B遍历ID以偶数结尾的数据。如果分成10片,则作业遍历数据的逻辑应为:每片分到的分片项应为ID%10,而服务器A被分配到分片项0,1,2,3,4;服务器B被分配到分片项5,6,7,8,9,直接的结果就是服务器A遍历ID以0-4结尾的数据;服务器B遍历ID以5-9结尾的数据。
2、分片项与业务处理解耦 Elastic-Job并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需要自行处理分片项与真实数据的对应关系。
3、个性化参数的适用场景 个性化参数即shardingItemParameter,可以和分片项匹配对应关系,用于将分片项的数字转换为更加可读的业务代码。例如:按照地区水平拆分数据库,数据库A是北京的数据;数据库B是上海的数据;数据库C是广州的数据。如果仅按照分片项配置,开发者需要了解0表示北京;1表示上海;2表示广州。合理使用个性化参数可以让代码更可读,如果配置为0=北京,1=上海,2=广州,那么代码中直接使用北京,上海,广州的枚举值即可完成分片项和业务逻辑的对应关系
3、横向比较
分布式定时任务调度系统技术选型
三、elastic-job的使用
1、项目集成elastic-job
1.1、依赖包引入
1.2、配置
1、使用yaml进行相关属性的配置,主要配置的是数据库连接池,注册中心、job属性配置 2、elastic-job相关的配置使用java配置实现(RegistryCenterConfig、SimpleJobConfig)
1.3、定时任务实现
先实现一个自己的任务类,需要实现elastic-job提供的SimpleJob接口,实现它的execute(ShardingContext shardingContext)方法
2、elastic-job控制台的使用
运维平台和elastic-job-lite并无直接关系,是通过读取作业注册中心数据展现作业状态,或更新注册中心数据修改全局配置。控制台只能控制作业本身是否运行,但不能控制作业进程的启动,因为控制台和作业本身服务器是完全分离的,控制台并不能控制作业服务器
控制台的功能列表:
1、登录安全控制
2、注册中心、事件追踪数据源管理
3、快捷修改作业设置
4、作业和服务器维度状态查看
5、操作作业禁用\启用、停止和删除等生命周期
6、事件追踪查询
1)运维平台和elastic-job-lite并无直接关系,是通过读取作业注册中心数据展现作业状态,或更新注册中心数据修改全局配置。
2)控制台只能控制作业本身是否运行,但不能控制作业进程的启动,
因为控制台和作业本身服务器是完全分离的,控制台并不能控制作业服务器。
界面展示及相应功能介绍
3、应用过程遇到的问题
3.1、springboot集成elastic-job后服务启动阻塞
3.2、job启动完成后,控制台一直显示分片待调整
3.3、elastic-job日数据库cpu和内存暴涨
3.4、 短频执行的任务不适合开启监听和事件跟踪 A. 业幂等性操作的问题 开启monitorExecution才能实现分布式作业幂等性(即不会在多个作业服务器运行同一个分片)的功能,但monitorExecution对短时间内执行的作业(如每5秒一触发)会造成Job堆积的情况;性能影响较大,建议关闭并自行实现幂等性;同样不建议开启misfire,对zk性能有影响;重启全部作业机器时,如果开启失效转移,一些特定的业务场景需要手动清除此作业的Failover数据节点,避免重启时候作业机器开始执行被标记为failover的作业
Bug列表
四、elastic-job的原理
1、整体架构图

模块说明:
1、Registry注册中心提供Job config,Job instance,Job status 存储;提供Rest API方便外部应用(Console)对Job生命周期进行统一控制;如:获取Job信息及运行信息,更新Job配置信息,暂停或禁止Job运行等操作
2、Console提供可视化页面,采集Job列表,配置信息,运行信息,分片状态,Job事件信息及Job命令下发;
3、Lite 作为Elastic Job的起承转合:主要负责 作业机器(Job instance)选主,作业分片,作业创建,作业注册,作业启动/暂停/禁止/misfire/failover;并通过一些列的Listener完成zookeeper节点变化的监听,实现宕机自动切换,失效转移,命令下发等功能;基于事件监听实现Job运行轨迹的跟踪
2、elastic-job启动过程
1、一个job是如何启动及注册 2、ZK的job的临时节点信息 3、控制台的状态变更或触发是如何通知到elastic-job

3、elastic-job的执行过程

4、源码分析
源码分析:https://blog.csdn.net/spy19881201/article/category/6784965
1、作业配置
2、作业初始化
3、作业执行
4、注册中心
5、作业数据存储
6、注册中心监听器
7、主节点选举
8、作业分片策略
9、作业分片
10、作业失效转移
11、作业事件追踪
12、作业监听器
13、自诊断修复
14、作业监控服务
15、运维平台
五、总结
思维导图
1、介绍为什么选择elastic-job。
2、 elastic-job的使用、特性及整体架构、启动过程。




