elastic-job-lite 入門以及架構原理分析

a_wei發表於2019-09-29

elastic-job-lite簡介

  • elastic-job是噹噹網開源的分散式任務排程系統,基於quartz二次開發實現的,由兩個相互獨立的子專案Elastic-Job-Lite和Elastic-Job-Cloud組成。

  • 前者主要定位為輕量級,去中心化的的分散式任務排程解決方案,是以jar包的形式提供,後者採用自研Mesos Framework的解決方案,額外提供資源治理、應用分發以及程式隔離等功能,

  • 我們今天主要說的是elastic-job-lite,cloud放在下一期講解,目前最新版本是3.0.0.M1-SNAPSHOT,已經停止更新了

  • 但是使用的人,公司和教程還是很多的,遇到問題基本通過搜尋可以解決的,解決不了的可以研究原始碼(還是相對比較好理解的)可以放心的使用。

    elastic-job-lite架構

  • elastic-job-lite輕量級的,去中心化的,上面說過他是基於quartz的,所以他的排程由使用其jar的專案驅動的,引入了zookeeper和分片的概念的為多臺機器排程提供了協調和並行,並且配備一個運維端來管理job

  • elastic-job-lite架構圖
    elastic-job-lite入門以及架構原理分析

  • 從上圖我們可以看出,elastic-job-lite是以zookeeper作為註冊中心的,console作為控制檯和服務端解構,直接操縱zk改變job的配置資訊,服務端啟動時連線zk,註冊job,初始化Scheuler,進行leader選舉,分片,然後按照job配置資訊排程作業,支援作業執行中的監控,event傳送,失敗轉移等

  • elastic-job-lite部署圖
    elastic-job-lite入門以及架構原理分析

  • elastic-web控制檯部署一臺機器(也只能部署一臺,有點坑),原因是elsatic-web通過介面新增zk的地址,寫入本臺機器檔案中,這是有狀態的,如果部署多臺,負載均衡後,你再頁面看到的資訊多次訪問後會不一致,因為會呼叫到不同的機器上,看下面的圖,就理解了,如果想要多臺做負載均衡,做HA,需要對這塊做二次開發。(一般小公司一臺足夠了,web沒什麼壓力)

elastic-job-lite入門以及架構原理分析

elastic-job-lite使用

elastic-job-lite 入門使用

  • 首先準備好zk叢集,elastic-job-lite使用zk作為註冊中心
  • 在自己的專案中引入maven依賴
<dependency> 
    <groupId>com.dangdang</groupId> 
    <artifactId>elastic-job-lite-core</artifactId> 
    <version>3.0.0.M1-SNAPSHOT</version> 
</dependency>
  • elastic-job-lite支援兩種作業型別,我們可以根據自己的業務需求選擇合適作業型別
    • io.elasticjob.lite.api.simple.SimpleJob 實現此介面代表這個作業時簡單累型作業
    • io.elasticjob.lite.api.dataflow.DataflowJob 實現此介面代表這個作業是支援流處理的作業
    • io.elasticjob.lite.api.script.ScriptJob 實現此介面代表這個作業是一個指令碼作業
//簡單作業型別
public class MyElasticJob implements SimpleJob { 
    @Override 
    public void execute(ShardingContext context) { 

    } 
}

簡單作業型別我們實現SimpleJob介面中的execute方法,在裡面處理自己的業務需求,排程器通過配置的cron表示式進行排程。

//流處理作業型別
public class MyElasticJob implements DataflowJob<T> {    
    //抓取資料
    @Override    
    public List<T> fetchData(ShardingContext shardingContext) {    
        return null;
    }        
    //執行資料
    @Override   
    public void processData(ShardingContext shardingContext, List<T> list){
    {        
}

流處理作業,需要實現DataflowJob中的兩個方法(fetchData,processData),第一個方法負責抓取資料,抓取之後交給第二個方法執行。

//指令碼作業
public class MyElasticJob implements ScriptJob {    
}

elastic-job-lite三種作業的配置相關

  • elastic-job-lite作業配置的類圖是這樣的
    elastic-job-lite入門以及架構原理分析

  • 我們分析上面類圖:

    • JobCoreConfiguration類定義了job作業核心配置屬性
    • JobTypeConfiguration, Job型別的配置介面,有三個實現類,對應上面三種型別的作業,JobTypeConfiguration介面定義了獲取JobCoreConfiguration類的方法
    • JobRootConfiguration, Job跟配置介面,定義了獲取JobTypeConfiguration實現類的方法
    • LiteJobConfiguration類實現了JobRootConfiguration介面
  • 接下來我們分析這寫類中定義的job配置屬性

屬性 所屬類 描述 簡單 流處理 指令碼
jobName JobCoreConfiguration 名稱
cron JobCoreConfiguration 時間表示式
shardingTotalCount JobCoreConfiguration 任務分片的總數
shardingItemParameters JobCoreConfiguration 每個分片對應的引數
jobParameter JobCoreConfiguration job從外部傳入的引數
failover JobCoreConfiguration 是否開啟失效轉移
misfire JobCoreConfiguration 是否開啟錯過執行
description JobCoreConfiguration 任務描述
jobProperties JobCoreConfiguration 任務的一些屬性配置
monitorExecution LiteJobConfiguration 是否開啟監控
maxTimeDiffSeconds LiteJobConfiguration 本機和註冊中心最大時間誤差數
moinitorPort LiteJobConfiguration 監控u的那口
jobShardingStrategyClass LiteJobConfiguration 分片策略類
disabled LiteJobConfiguration 設定作業是否啟動時禁止
overwrite LiteJobConfiguration 是否重寫配置
streamingProcess DataflowJobConfiguration 是否開啟流執行
scriptCommandLine ScriptJobConfiguration 指令碼命令列

elastic-job-lite任務執行架構圖

elastic-job-lite入門以及架構原理分析

  • 在elastic-job-lite中,由排程器統一排程job,每種型別的job都對應一個排程器(目前排程器只有一種實現SpringJobScheduler),準備說是一個job對應一個scheduler,每種型別的job執行方法不一樣,Simple型別通過執行execute方法,方法入參會攜帶分片引數決定當前機器處理那些分片的資料,DataFlow型別執行fetch方法,也是攜帶分片引數抓取屬於當前機器處理的資料交給execute方法執行,Script型別是通過觸發一個指令碼來執行指令碼中的業務邏輯,這個指令碼可以是window下的.exe檔案,也可以是python等檔案

elastic-job-lite的作業執行流程圖

elastic-job-lite入門以及架構原理分析

  • 上圖詳細描述elastic-job-lite中一個任務的執行流程,從quartz中一個job執行執行緒開始,呼叫LiteJob的execute方法,緊接著根據job的型別建立JobExecutor,開始執行jobExecutor,根據模板設計模式,父類AbstractExecutor規定了job的執行流程,子類重寫了具體不同job型別執行時的同邏輯。
  • 描述一下各個方法的作用
    • checkJobExecutionEnvironment檢查作業執行環境
    • getShardingContext獲取作業的分片的上下文
    • postJobStatusTraceEvent傳送作業狀態跟蹤時間
    • misfireRunning錯過執行檢查和設定
    • beforeJobExecuted作業執行前監聽器執行
    • execute執行作業
    • isExecuteMisfired是否執行錯過執行
    • failoverIfNecessary失效轉移是否執行
    • afterJobExecuted作業執行後監聽器執行

elastic-job-lite啟動流程

elastic-job-lite入門以及架構原理分析

  • 首先啟動連線註冊中心k,並且進行初始化,建立zk客戶端,接著作業排程器JobScheduler,執行排程器的init方法,在init方法中做如下事情
    • 往註冊中心更新jobConfig
    • 建立job調取器控制中心
    • 註冊job
    • 註冊job啟動資訊
      • 開啟關於job的zk監聽器
      • 主節點選舉
      • 持久化作業伺服器上線資訊
      • 持久化作業執行例項資訊
      • 設定重新分片的標記
      • 初始化作業監聽服務
      • 啟動調解分散式作業不一致狀態服務

elastic-job-lite優缺點

  • 從上面的分析我想大家已經能得出一些elastic-job-lite的一些利弊資訊了,這裡我在歸納總結一下
    • 優點
      • 輕量級,簡單,依賴少,只需一個zk就可以使用起來
      • 支援多種作業型別,分片,失效轉移,錯過執行,動態新增,刪除節點
      • 簡單的視覺化管理
      • 方便和spring整合,springboot整合
    • 缺點
      • 佔用業務機器資源,資源排程和業務執行沒有解耦
      • zk作為註冊中心不友好,不支援高可用
      • 不支援複雜的作業管理(作業依賴),一些複雜業務場景不可使用
      • 視覺化相對簡單,作業監控也比較簡單
      • 對單次執行不太友好

結束語

關於elastic-job-lite入門和原理就分享到這裡了,其實上面的每一個點深入下去都可以單獨寫一篇文章了,後續會慢慢把這塊再更新出來,希望幫助到大家,如果有收穫,辛苦關注一下,點個讚唄。

歡迎大家關注微信公眾號:“golang那點事”,更多精彩期待你的到來

elastic-job-lite入門以及架構原理分析

那小子阿偉

相關文章