一、.为什么要使用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),每次处理的都是一条数据。