1. 程式人生 > >Elastic-Job-Lite詳解之作業排程

Elastic-Job-Lite詳解之作業排程

JobScheduler是elastic-job作業排程的關鍵類,也是起始類,在包com.dangdang.ddframe.job.lite.api下。排程任務的執行需要包含兩大步驟:任務的配置和任務的註冊。JobScheduler的建構函式除了任務配置和註冊相關資訊之外還有事件和監聽。後兩者是elastic-job的擴充套件功能,我們後續再介紹。

任務的配置

由於內部使用quartz作為任務排程框架,任務的配置的相關的基礎資訊也是和quartz一致的。elastic-job的任務配置類在quartz的基礎上(執行方法,cron表示式等)額外封裝了分片策略,監控作業相關引數以及與註冊中心的時間誤差秒數等配置項。

任務的註冊

elastic-job是通過zookeeper進行任務協調和故障轉移的,任務的註冊也就是把任務註冊到zookeeper裡面去。任務的註冊包含在任務的啟動過程中。根節點是專案的名稱,下面一級是任務的名稱。任務一旦建立則不能修改任務的名稱,如果修改名稱將視為新的任務,建立新的節點。任務名稱節點下又包含5個數據子節點,分別是config, instances, leader, servers和sharding。如下圖:

image

1. config節點:

任務的配置資訊,包含執行類,cron表示式,分片演算法類,分片數量,分片引數等等。config節點的資料是通過ConfigService持久化到zookeeper中去的。預設狀態下,如果你修改了Job的配置比如cron表示式,分片數量等是不會更新到zookeeper上去的,除非你把引數overwrite修改成true。

2. instances節點:

同一個Job下的elastic-job的部署例項。一臺機器上可以啟動多個Job例項,也就是Jar包。instances的命名是[email protected]@+PID

3. leader節點:

任務例項的主節點資訊,通過zookeeper的主節點選舉,選出來的主節點資訊。下面的子節點分為electionsharding和failover三個子節點。分別用於主節點選舉,分片和失效轉移處理。election下面的instance節點顯式了當前主節點的例項ID:jobInstanceId。latch節點也是一個永久節點用於選舉時候的實現分散式鎖。sharding節點下面有一個臨時節點,necessary,

是否需要重新分片的標記。如果分片總數變化,或任務例項節點上下線或啟用/禁用,以及主節點選舉,都會觸發設定重分片標記,主節點會進行分片計算。

4. servers節點:

任務例項的資訊,主要是IP地址,任務例項的IP地址。如果多個任務例項在同一臺機器上執行則只會出現一個IP子節點。可在IP地址節點寫入DISABLED表示該任務例項禁用。 在新的cloud native架構下,servers節點大幅弱化,僅包含控制伺服器是否可以禁用這一功能。為了更加純粹的實現job核心,servers功能未來可能刪除,控制伺服器是否禁用的能力應該下放至自動化部署系統。

5. sharding節點:

任務的分片資訊,子節點是分片項序號,從零開始,至分片總數減一。分片個個數是在任務配置中設定的。分片項序號的子節點儲存詳細資訊。每個分片項下的子節點用於控制和記錄分片執行狀態。最主要的子節點就是instance。舉例來說,上圖有三個分片,每個分片下面有個instance的節點,也就說明了這個分片在哪個instance上執行。如上文所說如果分片總數變化,或任務例項節點上下線或啟用/禁用,以及主節點選舉,都會觸發設定重分片標記,主節點會進行分片計算。分片計算的結果也就體現在這instance上。

任務的啟動

任務的啟動過程,就是任務例項和zookeeper進行互動的過程。每個例項在啟動過程中,會把自身的資訊註冊到zookeeper中去。並完成選舉和分片策略的設定,也就是完成上文一些zookeeper節點的建立和持久化。

整個啟動的過程都在JobScheduler.init()方法中完成。其中最重要的方法registerStartUpInfo完成了監聽,選舉持久化資料,以及設定分片標誌位(為了任務執行是主節點進行分片演算法)等工作。init()方法中完成了配置和註冊之後,相關的引數被傳遞給了JobScheduleController類,這個類就是quartz的封裝。之前配置的任務執行類和cron表示式被轉換成JobDetail和Trigger這兩個quartz的類,然後通過quartz的scheduler.start觸發任務。等待任務的執行。

整體流程圖如下:

任務的執行

任務的執行依賴於quartz job的觸發。elastic-job的LiteJob類繼承自quartz的Job類,在任務觸發的時候,新增額外的邏輯處理。LiteJob的執行器AbstractElasticJobExecutor有兩個具體的實現,SimpleJobExecutor和DataflowJobExecutor,各自執行SimpleJob和DataflowJob兩種Job型別。Job觸發的時候,SimpleJobExecutor或者DataflowJobExecutor會被new一次,重新從快取中載入Job配置並執行。

LiteJob把任務的執行分為執行前,執行(業務程式碼的執行),和執行後三個階段。在執行前階段中主要實現分片策略的執行(shardingIfNecessary方法),記錄事件,執行監聽事件等等。而執行後階段主要處理錯過執行的相關任務以及執行監聽事件。

整個執行流程圖如下: