Elastic-Job源码解析(三)之分片定时任务执行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Message_lx/article/details/83957595

通过本篇的阅读你将学会了解Elastic-Job的定时时机,及如何通过分片方式做一个分布式的定时任务框架。了解常用的三种分片策略,及如何自定义分布式分片策略

目录

  • Elastic-Job如何通过SpringJobScheduler启动定时
  • Elastic-Job的三种分片策略
  • 分片策略总结
  • 从源码学习如何自定义分片策略

Elastic-Job如何通过SpringJobScheduler启动定时

在<<Elastic-Job源码解析(一)之与Spring完美整合>>中我们已经了解Elasti-Job非常巧妙的用BeanDefinitionParse解析器将任务类型最终通过抽象类的方式解析成了SpringJobScheduler
三种Job类型

通过抽象类的方式解析成了SpringJobScheduler

通过抽象类的方式解析成了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的三种分片策略

什么是分片策略呢? 什么情况下有分片策略呢?

最大的亮点就是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中指定默认

好了,读这么多,很辛苦了,给大家发张图,养养神

猜你喜欢

转载自blog.csdn.net/Message_lx/article/details/83957595
今日推荐