因现有系统的调度系统对作业的生命周期,执行轨迹与状态监控和报警,无统一的管理和资源规划;导致运维维护困难、调度与执行耦合性严重、开发不规范、作业周期设置不合理等因素带来的一系列定位问题困难,人工干预困难及资源控制不合理的问题;调研了几项比较热门的开源的分布式调度系统,最后因某些原因,选择了自研;
Elastic Job主要功能的
A. 开源地址 github.com/elasticjob/…
B. Elastic Job文档 elasticjob.io/docs/elasti…
C. Bug列表 github.com/elasticjob/…
支持功能项 | 待改造项目 | Elastic Job |
---|---|---|
动态管理Job生命周期 | 否 | 是 |
直观展示Job的web页面 | 否 | 是 |
Misfire功能 | 否 | 是 |
Job容错Failover功能 | 否 | 是 |
HA | 否 | 是 |
跟踪Job执行轨迹 | 否 | 是 |
线程是否可控 | 是 | 否 |
Elastic Job 主要支持功能项列表
A. 支持Job生命周期的管理
- 提供全部的job列表,支持Job的在线搜索及统计,并直观的展现Job的运行状态
- 支持对Job直接触发;动态的暂停,失效,及修改Job信息(Cron表达式,分片总数,携带自定义参数,是否失效转移,是否开启错过执行等主要的信息的动态修改);
B. 支持Job Fail Over 失效转移的策略
- 当运行Job A的所在机器 Task Server A 宕机后,如果开启失效转移,Job A会立即选择一个备机 Task Server B上补偿 执行 Job A;
- 触发重新选举,选择由哪台Task Server来执行 Job A;
C. 支持分布式调度协调,确保在job在分布式环境下执行的幂等性
- 确保一个Job在分布式环境下只有一台Task Server 在执行(注意事项),采用热备方式保证HA
- 通过zk leader选举,leader协调分布式环境下的Job,执行分片和清理分片
D. 支持Job MisFire 错过重新执行策略
- 开启Misfire和 Monitor-Execution后,当Job B 1执行时,发现Job B2正在执行,为Job B2设置Misfire标志,当Job B1执行完比后执行 Job B2
E. 支持Job运行轨迹的记录
- 提供了事件追踪功能,可通过事件订阅的方式处理调度过程的重要事件,用于查询、统计和监控。Elastic-Job目前提供了基于关系型数据库两种事件订阅方式记录事件
F. 支持丰富的作业类型
- Simple 类型 一般Job采用此方式
- Dataflow 类型 : 以流式方式处理业务逻辑
- Script类型 : 以脚本方式创建Job
G. 支持作业并行调度
- 同一Job在执行时,可以以多实例执行;只需要指定不同的job name;
H. 支持定制化处理
- 支持定制化的异常处理
- 支持定制化的线程池处理
Elastic Job 操作时需要注意的问题
A. 业幂等性操作的问题
- 开启monitorExecution才能实现分布式作业幂等性(即不会在多个作业服务器运行同一个分片)的功能,但monitorExecution对短时间内执行的作业(如每5秒一触发)会造成Job堆积的情况;性能影响较大,建议关闭并自行实现幂等性;同样不建议开启misfire,对zk性能有影响;
- 重启全部作业机器时,如果开启失效转移,一些特定的业务场景需要手动清除此作业的Failover数据节点,避免重启时候作业机器开始执行被标记为failover的作业;
Elastic Job 目前存在问题
A. 间隔短的Job幂等性问题需要业务代码去控制;
B. 性能问题:一个分片为1的Job,产生线程数为4个,一个执行分片的Job线程数为 4 + 可运行核数*2;需要修改源码规范线程使用;
C. Tomcat正常关闭(非 kill)的情况下,提醒内存泄露,线程池中的线程和调度线程未被销毁;此问题因创建Schduler时未指定容易销毁时关闭调度,导致调度线程未终止;修改源码JobScheduler指定销毁动作即可;
D. 分布式一次监听AbstractDistributeOnceElasticJobListener在并发下存在不可用问题;此问题通过修改源码已经修复;
E. 短频执行的任务不适合开启监听和事件跟踪;
架构设计
A. 环境说明
- Job配置存储:xml存储/java代码配置/scrip配置
- 外部依赖zookeeper( 3.4.6及其以上版本);实现master选举,分布式协调/通知,分布式队列,分布式锁
- JDK 1.7以上版本
- Maven3.0.4及其以上版本
B. 模块说明
- Registry注册中心提供Job config,Job instance,Job status 存储;提供Rest API方便外部应用(Console)对Job生命周期进行统一控制;如:获取Job信息及运行信息,更新Job配置信息,暂停或禁止Job运行等操作
- Console提供可视化页面,采集Job列表,配置信息,运行信息,分片状态,Job事件信息及Job命令下发;
- Lite 作为Elastic Job的起承转合:主要负责 作业机器(Job instance)选主,作业分片,作业创建,作业注册,作业启动/暂停/禁止/misfire/failover;并通过一些列的Listener完成zookeeper节点变化的监听,实现宕机自动切换,失效转移,命令下发等功能;基于事件监听实现Job运行轨迹的跟踪;
C. 启动流程
D. 作业执行
项目部署
A. 应用部署
- 启动Elastic-Job-Lite指定注册中心的Zookeeper
- 运行包含Elastic-Job-Lite和业务代码的jar文件。不限与jar或war的启动方式
B. 运维部署
- 解压缩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编译获取
其他开源的分布式调度框架
- LTS github.com/ltsopensour…
- Antares github.com/ihaolin/ant…
- opencron www.oschina.net/news/83951/…
- XXL-JOB github.com/xuxueli/xxl…
- Uncode-Schedule github.com/rabbitgyk/u…
- SchedulerX jm.taobao.org/2016/07/28/… 等
后续会带来Elastic Job和Quarzt的源码解析