Elastic-Job原始碼解析(三)之分片定時任務執行
通過本篇的閱讀你將學會了解Elastic-Job的定時時機,及如何通過分片方式做一個分散式的定時任務框架。瞭解常用的三種分片策略,及如何自定義分散式分片策略
目錄
- Elastic-Job如何通過SpringJobScheduler啟動定時
- Elastic-Job的三種分片策略
- 分片策略總結
- 從原始碼學習如何自定義分片策略
Elastic-Job如何通過SpringJobScheduler啟動定時
在<<Elastic-Job原始碼解析(一)之與Spring完美整合>>中我們已經瞭解Elasti-Job非常巧妙的用BeanDefinitionParse解析器將任務型別最終通過抽象類的方式解析成了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 平均分片
如果分片不能整除, 則不能整除的多餘分片將依次追加到序號小的伺服器.
如:
- 如果有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].
OdevitySortByNameJobShardingStrategy
根據作業名的雜湊值奇偶數決定IP升降序演算法的分片策略.
作業名的雜湊值為奇數則IP升序.
作業名的雜湊值為偶數則IP降序.
用於不同的作業平均分配負載至不同的伺服器.
如:
- 如果有3臺伺服器, 分成2片, 作業名稱的雜湊值為奇數, 則每臺伺服器分到的分片是: 1=[0], 2=[1], 3=[].
- 如果有3臺伺服器, 分成2片, 作業名稱的雜湊值為偶數, 則每臺伺服器分到的分片是: 3=[0], 2=[1], 1=[].
RotateServerByNameJobShardingStrategy
根據作業名的雜湊值對伺服器列表進行輪轉的分片策略.
分片策略總結
通過對上面的分片策略來看啊,這所謂的三種分片策略其實都是利用AverageAllocationJobShardingStrategy 平均分片,非常巧妙也非常敷衍。
巧妙是說充分利用了平均分片的策略,只不過將serverList排序就實現了另一種分片策略,敷衍是說沒有多大作用。其實完全可以實現通過機器效能的監控同步到ZK,然後在根據機器效能來平均分片的,這樣小編感覺更加合理寫。不過因為Elastic Job提供了指定策略的介面,所以具體怎麼分的能力,就交給使用者自己去實現吧。
對於根據作業名輪詢策略和IP降級策略,小編無話可說,不知道到底好用不好用,以及有啥實際用處。不過小編在工作中一直用平均策略。說到這裡我們順便分析下如何自定義分片策略。
從原始碼學習如何自定義分片策略
我們先看原始碼是從哪裡弄到分片策略資訊的
從配置中讀取分片策略class屬性值
自定義分片策略class
如果沒有指定預設平均分,在JobShardingStrategyFactory中指定預設
好了,讀這麼多,很辛苦了,給大家發張圖,養養神