主流定时任务解决方案全横评( 二 )


02
使用方式
使用者需要在 yaml 中配置注册中心 zk 地址以及任务的配置信息:
elasticjob:regCenter:serverLists: localhost:6181namespace: elasticjob-lite-springbootjobs:simpleJob:elasticJobClass: org.apache.shardingsphere.elasticjob.lite.example.job.SpringBootSimpleJobcron: 0/5 * * * * ?timeZone: GMT+08:00shardingTotalCount: 3shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou实现对应的接口即可标识对应的任务,同时通过配置监听器来实现任务执行前后回调:
public class MyElasticJob implements SimpleJob {@Overridepublic void execute(ShardingContext context) {switch (context.getShardingItem()) {case 0:// do something by sharding item 0break;case 1:// do something by sharding item 1break;case 2:// do something by sharding item 2break;// case n: ...}}}public class MyJobListener implements ElasticJobListener {@Overridepublic void beforeJobExecuted(ShardingContexts shardingContexts) {// do something ...}@Overridepublic void afterJobExecuted(ShardingContexts shardingContexts) {// do something ...}@Overridepublic String getType() {return "simpleJobListener";}}03
实现原理
ElasticJob 底层时间调度基于 Quartz,Quartz 需要持久化业务 Bean 到底层数据表中,系统侵入性相当严重,同时通过 db 锁定进行任务抢占,不支持并行调度,不具备可扩展性 。而 ElasticJob 通过数据分片以及自定义分片参数的特性完成了水平扩展,可以将一个任务拆分为 N 独立的任务项,由分布式的服务器并行执行各自分配到的分片项 。比如一个数据库中有 1 亿条数据,需要将这些数据读取出来并进行计算,就可以将这 1 亿条数据划分成 10 个分片,每一个分片读取其中的 1 千万条数据,然后计算后写入数据库 。如果有三台机器执行,A 机器分到分片(0,1,2,9),B 机器分到分片(3,4,5),C 机器分到分片(6,7,8),这也是相比于 Quartz 最显著的优势 。
实现上 ElasticJob 使用 zookeeper 作为注册中心进行分布式调度协调以及 leader 节点的选举,通过注册中心的临时节点的变化来感知服务器的增减,每当 leader 节点选举,服务器上下线,分片总数变更时均会触发后续的重新分片,由 leader 节点在下次定时任务触发时进行具体的分片划分,再由各节点从注册中心中获取分片信息,作为任务的运行参数进行执行 。

主流定时任务解决方案全横评

文章插图
 
04
方案分析
ElasticJob 作为分布式任务框架,解决了上述单节点任务无法保证任务执行过程中的高可用和高并发下执行的性能的问题,并支持失败转移(failover)和错过执行的作业重新执行(misfire)等高级机制,但在使用过程中仍存在以下痛点:
  • 框架整体较重,需要依赖外置注册中心zk,增加了至少三台服务器的使用成本和维护复杂度
  • 随着任务量的不断增多,zk 作为有状态中间件将会成为性能瓶颈
  • 可观测能力弱,需要额外引入 db 并配置事件追踪
  • 任务常驻,当无任务执行时造成不必要的资源成本浪费
04
XXLJobAliware
01
目标定位
XXLJob 作为大众点评员工开源的一款分布式任务框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展 。XXLJob 具备丰富的功能,如任务分片广播,超时控制,失败重试,阻塞策略等,并通过体验友好的白屏化控制台对任务进行管理和维护 。
02
使用方式
XXLJob 分为中心式调度器和分布式执行器两部分组成,在使用时需要分别启动,在调度中心启动时需要配置所依赖的 db 配置 。
执行器需要配置调度中心的地址:
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-adminxxl.job.accessToken=xxl.job.executor.appname=xxl-job-executor-samplexxl.job.executor.address=xxl.job.executor.ip=xxl.job.executor.port=9999xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandlerxxl.job.executor.logretentiondays=30通过 bean 模式方法形式创建任务和前后回调的使用方式如下:
@XxlJob(value = https://www.isolves.com/it/cxkf/bk/2022-07-18/"demoJobHandler2", init = "init", destroy = "destroy")public void demoJobHandler() throws Exception {int shardIndex = XxlJobHelper.getShardIndex();int shardTotal = XxlJobHelper.getShardTotal();XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);}public void init(){logger.info("init");}public void destroy(){logger.info("destory");}创建任务完成后,需要在控制台上配置任务的执行策略:
主流定时任务解决方案全横评


推荐阅读