1. 程式人生 > >Elastic-Job原始碼解析(三)之分片定時任務執行

Elastic-Job原始碼解析(三)之分片定時任務執行

通過本篇的閱讀你將學會了解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中指定預設

好了,讀這麼多,很辛苦了,給大家發張圖,養養神