文章目录
- 前言
- 一、架构:
- 二、作业:
- 三、日志记录:
- 总结
前言
本文对分布式调度任务 Xxl-job 与 ElasticJob的对比 进行介绍。
一、架构:
Xxl-job : cs 架构 ,分为客户端和服务端,是有中心的架构,客户端为执行job 任务的执行器实例;服务端可以进行单独的集群部署,服务端控制任务的触发,以及任务的分配,故障转移,日志记录等;服务端承接了大部分的工作;
ElasticJob: cs 架构,分为客户端和服务端,是无中心的架构;客户端为执行job 任务的执行器实例;服务端为集群的zookeeper ,其中zookeeper 保存注册任务的实例,任务的配置项,以及负责leader 的选举;任务具体有哪个实例去执行,是由leader (也是一个job 执行的实例)进行的分配; 任务的触发,以及任务的分配,故障转移,日志记录等都是由 elasticjob-lite-core 进行管理,客户端承接了大部分的工作;
二、作业:
Xxl-job :作业分为 广播作业 和 某个实例单独作业;其中广播作业在任务达到时间被触发时,会被发送到所有有效的实例;某个实例单独作业 只会被发送到某个实例中;
xxl-job 任务路由策略:
ElasticJob:作业分为 简单作业和 流式的作业,其中简单作业同xxl-job 相同,当任务达到时间被触发时,leader 会选择某个节点进行作业;与简单作业不同 流式作业 提供了两个方法当每一次任务触发,只要fetchData 能返回数据,则当前这次任务就会一直调用 processData 进行作业,直到 fetchData 返回为null 或者集合为空;
ElasticJob 注册到zookeeper 的任务实例:
ElasticJob 中有分片的概念,来弥补某个实例单独作业 其它实例空闲,可以将任务定义分片数量,分片数量可以大于job 实例数,从而提高并发性能;当某个分片接收到任务是,可以根据当前分片得到对应的参数,从而执行不同的业务逻辑处理;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.elasticjob.api.ShardingContext;
import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class MyJob implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {// 分片参数 0=text,1=image,2=radio,3=vedioString shardingParameter= shardingContext.getShardingParameter();String jobParameter= shardingContext.getJobParameter();log.debug("job 执行 error,job名称:{},分片数量:{},分片:{},分片参数:{},jobParamer:{}", shardingContext.getJobName(), shardingContext.getShardingTotalCount(),shardingContext.getShardingItem(), shardingParameter,jobParameter);if ("text".equals(jobParameter)) {// do something by sharding}switch (shardingContext.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: ...}}
}
三、日志记录:
Xxl-job : 通过http 请求通信,在服务端记录job 的执行情况,并生成日志记录,展现日志的执行情况;
ElasticJob: 需要单独在job 里定义 日志记录的数据源,从而在客户端的数据可以记录日志,需要部署对应 ElasticJob-Console 登陆后,配置对应的数据源,从而可以得到job 的执行情况;
总结
综合来看,Xxl-job 更适合于在 Spring 生态圈中使用的项目,提供了简洁易用的任务管理界面;而 ElasticJob 则更加灵活,功能更为丰富,适用范围更广泛,可以满足复杂的分布式定时任务需求。