分布式任务elasticjob框架原理了解及使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式任务elasticjob框架原理了解及使用相关的知识,希望对你有一定的参考价值。

参考技术A 一、.为什么要使用elasticjob

1. 可动态修改任务执行时间, 解决quartz 修改配置需重启系统问题. 可运维.

2: 可通过调整分片的方式, 动态调整任务执行线程的数量. 动态改变任务吞吐量.

3: Lite-Job 一台机器能起一个实例, 多台机器分别起实例同时执行, 解决quartz 单机执行问题, 可扩展.

二、elasticjob原理

底层执行仍然采用quartz,执行过程中会对数据进行取膜。取膜结果与当前服务器拥有的分片做比较,相等则执行,否则不予执行。

单机多分片情形:job触发时会new多个线程执行(每个线程的分片数不同)

多机多分片情形:job触发时会先去zookeeper节点下的leader节点检测看是否有sharding目录下的necssary节点,有则会重新执行分片。分片策略参考如下。

三、分片策略

1.AverageAllocationJobShardingStrategy

基于平均分配算法的分片策略,也是默认的分片策略。

如果分片不能整除,则不能整除的多余分片将依次追加到序号小的服务器。如:

如果有3台服务器,分成9片,则每台服务器分到的分片是:1=[0,1,2], 2=[3,4,5], 3=[6,7,8]

如果有3台服务器,分成8片,则每台服务器分到的分片是:1=[0,1,6], 2=[2,3,7], 3=[4,5]

如果有3台服务器,分成10片,则每台服务器分到的分片是:1=[0,1,2,9], 2=[3,4,5], 3=[6,7,8]

2.OdevitySortByNameJobShardingStrategy

根据作业名的哈希值奇偶数决定IP升降序算法的分片策略。

作业名的哈希值为奇数则IP升序,作业名的哈希值为偶数则IP降序。

用于不同的作业平均分配负载至不同的服务器。

AverageAllocationJobShardingStrategy的缺点是,一旦分片数小于作业服务器数,作业将永远分配至IP地址靠前的服务器,导致IP地址靠后的服务器空闲。而OdevitySortByNameJobShardingStrategy则可以根据作业名称重新分配服务器负载。如:

如果有3台服务器,分成2片,作业名称的哈希值为奇数,则每台服务器分到的分片是:1=[0], 2=[1], 3=[]

如果有3台服务器,分成2片,作业名称的哈希值为偶数,则每台服务器分到的分片是:3=[0], 2=[1], 1=[]

3.RotateServerByNameJobShardingStrategy

根据作业名的哈希值对服务器列表进行轮转的分片策略。

四、处理方式

1、SimpleJob类型处理方式

意为简单实现,未经任何封装的类型。需实现SimpleJob接口。该接口仅提供单一方法用于覆盖,此方法将定时执行。与Quartz原生接口相似,但提供了弹性扩缩容和分片等功能。

2、DataflowJob类型作业

流式处理类型作业

即使实现了DataflowJob接口 默认也是不开启流式作业。

何为流式?  就是fetchData后List,调用processData时候,传整个list。执行后再去fetch,如果还有符合条件的继续processData。

非流式只有时间片到了才触发执行。

此外,还有一点, fetch的List, 会遍历list,每条记录作为task扔到线程中,processData(List),每次处理的都是一条数据。

以上是关于分布式任务elasticjob框架原理了解及使用的主要内容,如果未能解决你的问题,请参考以下文章

elastic job 问题汇总

SpringBoot2 整合ElasticJob框架,定制化管理流程

SpringBoot-ElasticJob封装快速上手使用(分布式定时器)

SpringBoot定时任务 - 什么是ElasticJob?如何集成ElasticJob实现分布式任务调度?

三分钟了解elastic-job-lite

源码分析ElasticJob任务错过机制(misfire)与幂等性