背景介绍
ElasticJob是一款基于quartz开发,依赖zookeeper作为注册中心、轻量级、无中心化的分布式任务调度框架,已在多家公司投入使用,目前已经通过Apache开源:https://github.com/apache/shardingsphere-elasticjob
阿里巴巴商业化任务调度平台SchedulerX2.0兼容开源ElasticJob任务接口,用户不需要修改一行代码,即可以将ElasticJob任务在SchedulerX2.0平台上托管,享有低成本、免运维、可视化、报警监控等能力。
托管ElasticJob的优势
可视化
之前当当开源的ElasticJob console已经停止更新,重新在Apache开源后,甚至去除了console。SchedulerX作为商业化任务调度平台,在可视化能力上功能比较丰富
- 用户大盘
- 查看任务历史执行记录
- 查看任务运行日志
- 查看任务运行堆栈
- 查看任务操作记录
高级特性
- 任务编排:支持工作流(DAG)进行任务编排,操作简单,前端直接单手操作拖拖拽拽即可。详细的任务状态图能一目了然看到下游任务为什么没跑。
- 限流:常见场景是夜间离线报表业务,比如很多报表任务是晚上1、2点开始跑,要控制应用最大并发的任务数量(否则业务扛不住),达到并发上限的任务会在队列中等待。同时要求早上9点前必须把KPI报表跑出来,可以设置KPI任务高优先级,会抢占低优先级任务优先调度。
SchedulerX支持可抢占的任务优先级队列,只需要在控制台进行配置
- 资源隔离:支持命名空间和应用级别资源隔离,支持多租户权限管理
商业化报警运维
- 报警:支持邮件、钉钉、短信、电话,其他报警方式在规划中。支持任务失败、超时、无可用机器报警。报警内容可以简单的看出任务失败的原因,以钉钉机器人为例
- 运维操作:原地重跑、重刷数据、标记成功、查看堆栈、停止任务、指定机器等
免运维、低成本
ElasticJob依赖zookeeper作为任务存储和任务调度协调,至少需要3个节点的zookeeper。zookeeper运维非常麻烦,如果有节点挂了,需要重新配置zookeeper的服务端和客户端的配置,可能需要重启所有的应用。
同时,zookeeper性能也比较差,如果任务量级比较大,一个zookeeper集群无法抗住,且zookeper无法水平扩展支持更大的tps,就需要维护多个zookeeper集群,则机器成本更加大了。
通过Schedulerx2.0托管ElasticJob任务,不需要自己维护zookeeper集群,也不需要关注任务量级的增长,省去了机器和人力维护成本。
高可用
SchedulerX2.0采用高可用架构,任务多备份机制,经历阿里集团多年双十一、容灾演练,可以做到整个集群挂掉任意2个节点或者任意一个机房断电,任务调度都不会受到影响。
与开源ElasticJob区别
开源ElasticJob |
SchedulerX为底座的ElasticJob任务 |
|
Simple任务 |
支持 |
支持 |
Script任务 |
支持 |
支持 |
Dataflow任务 |
支持 |
暂不支持 |
单机 |
支持 |
支持 |
分片广播 |
支持 |
支持 |
定时 |
cron |
cron、fixed_rate、fixed_delay、one_time |
工作流 |
不支持 |
支持 |
可视化 |
无 |
历史记录、日志服务、运行堆栈、操作记录、用户大盘等 |
监控报警 |
无 |
邮件、钉钉群、短信、电话 |
运维操作 |
无 |
运行一次、原地重跑、重刷数据、标记成功、停止运行 |
如何接入(有完整demo)
以springboot接入为例,参考demo
- pom增加schedulerx2-plugin-elasticjob插件,排掉elasticjob-simple-executor
<!-- elasticjob --> <dependency> <groupId>org.apache.shardingsphere.elasticjob</groupId> <artifactId>elasticjob-lite-spring-boot-starter</artifactId> <version>3.0.1</version> <exclusions> <exclusion> <groupId>org.apache.shardingsphere.elasticjob</groupId> <artifactId>elasticjob-simple-executor</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-plugin-elasticjob</artifactId> <version>3.0.1.2</version> </dependency>
- 提前在schedulerx控制台建好你的命名空间和应用
- application.yml在原有elasticjob配置修改如下:
elasticjob regCenter serverLists localhost2181 namespace elasticjob-springboot-demo schedulerx#这里需要增加一个"schedulerx:",则如下任务会自动同步到schedulerx控制台 jobs simpleJob elasticJobClass com.alibaba.elasticjob.test.processor.SpringBootSimpleJob cron 0/10 * * * * ? shardingTotalCount1 overwritetrue shardingJob elasticJobClass com.alibaba.elasticjob.test.processor.SpringBootShardingJob cron 0 * * * * ? shardingTotalCount3 shardingItemParameters 0=Beijing,1=Shanghai,2=Guangzhou overwritetrue #增加如下schedulerx的配置,参考:https://help.aliyun.com/document_detail/161998.html spring schedulerx2 endpoint acm.aliyun.com namespace 433d8b23-xxxx-xxxx-xxxx-90d4d1b9a4af groupId xueren_primary appKey xxxxxxxxxxx regionId public aliyunAccessKey xxxxxxxxxxxx aliyunSecretKey xxxxxxxxxxxx
- 启动程序增加自动扫描com.alibaba.schedulerx.plugin.*
- 配置日志服务,搜集客户端的日志,详情可以参考: https://developer.aliyun.com/article/861431
使用log4j2,配置log4j2.xml
<Configuration status="off"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n" /> </Console> <SchedulerxLog4j2Appender name="schedulerxLog" timeFormat="yyyy-MM-dd'T'HH:mmZ" timeZone="UTC" ignoreExceptions="true"> <PatternLayout pattern="%d %-5level [%thread] %logger{0}: %msg"/> </SchedulerxLog4j2Appender> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console" /> </Root> <Logger name="schedulerx" level="info" additivity="false"> <AppenderRef ref="schedulerxLog" /> </Logger> </Loggers> </Configuration>
java执行类如下
- 启动程序后,schedulerx控制台会自动同步任务,其中
- 调度频率为秒级别,时间类型会改为second_delay
- 分片个数大于1,执行方式为分片运行,否则是单机运行
- 通过控制台,可以直接看到任务的运行日志