目录
- Elastic-Job如何通过SpringJobScheduler启动定时
- Elastic-Job的三种分片策略
- 分片策略总结
- 从源码学习如何自定义分片策略
在Elastic-Job源码解析(一)之与Spring完美整合 中我们已经了解Elasti-Job非常巧妙的用BeanDefinitionParse解析器将任务类型最终通过抽象类的方式解析成了SpringJobScheduler
三种Job类型
通过抽象类的方式解析成了SpringJobScheduler
我们看SpringJobScheduler定时器的架构,SpringJobScheduler即使一个定时器,是JobScheduler的子类。真正定时的逻辑是由JobScheduler类处理的包括上面的init方法和shutdown方法。
SpringJobScheduler关系图
init方法中启动定时器,可以看到内部核心还是由quartz来实现的和小编在上一篇写的quartz很类似
当执行完
jobScheduleController.scheduleJob()这行时候,就启动了quartz的定时功能
quartz直接执行LiteJob.execute。
然后根据任务类型生成指定类型的执行器,并执行
任务类型对应的执行器是下面这些
任务类型对应的执行器
从中我们分析最常见的任务类型SimpleJobExecutor,这里面我们主要看ShardingContext分片上下文是怎么生成的,很明显是有抽象类
AbstractElasticJobExecutor来生成的。分片策略一定也是在这个里面执行的,最终生成
ShardingContext类的,而这个类就是Elastic-Job给每台服务器上的任务分配的上下文,这里面就包括了分配标识
如何使用分片标识做任务处理
下面我们就主要看他的分片策略是什么?
什么是分片策略呢? 什么情况下有分片策略呢?
最大的亮点就是Elastic-Job是一个分布式的任务解决方案,所谓分布式就是有多个服务器部署,然后通过Zookeeper来进行交互
分配任务,这里说分配任务有点夸大了他的能力,他其实只是给你个分片,然后开发者根据分片去自己到数据库或者是其他数据源中拿到,改分片对应的
任务来执行。而我们所谓说的分片就是ShardingContext对象。就是说ElasticJob把你生成了ShardingContext。ElasticJob提供了3中策略。
Elastic-Job总共提供了3种策略
AverageAllocationJobShardingStrategy 平均分片
基于平均分配算法的分片策略.
如果分片不能整除, 则不能整除的多余分片将依次追加到序 小的服务器.
如:
1. 如果有3台服务器, 分成9片, 则每台服务器分到的分片是: 1=[0,1,2], 2=[3,4,5], 3=[6,7,8].
2. 如果有3台服务器, 分成8片, 则每台服务器分到的分片是: 1=[0,1,6], 2=[2,3,7], 3=[4,5].
3. 如果有3台服务器, 分成10片, 则每台服务器分到的分片是: 1=[0,1,2,9], 2=[3,4,5], 3=[6,7,8].
OdevitySortByNameJobShardingStrategy
根据作业名的哈希值奇偶数决定IP升降序算法的分片策略.
作业名的哈希值为奇数则IP升序.
作业名的哈希值为偶数则IP降序.
用于不同的作业平均分配负载至不同的服务器.
如:
1. 如果有3台服务器, 分成2片, 作业名称的哈希值为奇数, 则每台服务器分到的分片是: 1=[0], 2=[1], 3=[].
2. 如果有3台服务器, 分成2片, 作业名称的哈希值为偶数, 则每台服务器分到的分片是: 3=[0], 2=[1], 1=[].
RotateServerByNameJobShardingStrategy
根据作业名的哈希值对服务器列表进行轮转的分片策略.
分片策略总结
通过对上面的分片策略来看啊,这所谓的三种分片策略其实都是利用
AverageAllocationJobShardingStrategy 平均分片,非常巧妙也非常敷衍。
巧妙是说充分利用了平均分片的策略,只不过将serverList排序就实现了另一种分片策略,敷衍是说没有多大作用。其实完全可以实现通过机器性能的监控同步到ZK,然后在根据机器性能来平均分片的,这样小编感觉更加合理写。不过因为Elastic Job提供了指定策略的接口,所以具体怎么分的能力,就交给使用者自己去实现吧。
对于根据作业名轮询策略和IP降级策略,小编无话可说,不知道到底好用不好用,以及有啥实际用处。不过小编在工作中一直用平均策略。说到这里我们顺便分析下如何自定义分片策略。
自定义分片策略
我们先看源码是从哪里弄到分片策略信息的
从配置中读取分片策略class
自定义分片策略class
如果没有指定默认平均分,在
JobShardingStrategyFactory中指定默认
好了,读这么多,很辛苦了,给大家发张图,养养神
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!