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 入門使用
首先準備好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支援三種作業型別,我們可以根據自己的業務需求選擇合適作業型別

  1. io.elasticjob.lite.api.simple.SimpleJob 實現此介面代表這個作業時簡單累型作業
  2. io.elasticjob.lite.api.dataflow.DataflowJob 實現此介面代表這個作業是支援流處理的作業
  3. 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 入門以及架構原理分析

我們分析上面類圖:

  1. JobCoreConfiguration類定義了job作業核心配置屬性
  2. JobTypeConfiguration, Job型別的配置介面,有三個實現類,對應上面三種型別的作業,JobTypeConfiguration介面定義了獲取JobCoreConfiguration類的方法
  3. JobRootConfiguration, Job跟配置介面,定義了獲取JobTypeConfiguration實現類的方法
  4. LiteJobConfiguration類實現了JobRootConfiguration介面

接下來我們分析這寫類中定義的job配置屬性,我整理完成後截圖如下:

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

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型別執行時的同邏輯。

描述一下各個方法的作用

  1. checkJobExecutionEnvironment檢查作業執行環境
  2. getShardingContext獲取作業的分片的上下文
  3. postJobStatusTraceEvent傳送作業狀態跟蹤時間
  4. misfireRunning錯過執行檢查和設定
  5. beforeJobExecuted作業執行前監聽器執行
  6. execute執行作業
  7. isExecuteMisfired是否執行錯過執行
  8. failoverIfNecessary失效轉移是否執行
  9. afterJobExecuted作業執行後監聽器執行

elastic-job-lite啟動流程

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

首先啟動連線註冊中心k,並且進行初始化,建立zk客戶端,接著作業排程器JobScheduler,執行排程器的init方法,在init方法中做如下事情

  1. 往註冊中心更新jobConfig
  2. 建立job調取器控制中心
  3. 註冊job
  4. 註冊job啟動資訊,這一步裡面又做了很多事情,開啟關於job的zk監聽器,主節點選舉,持久化作業伺服器上線資訊,持久化作業執行例項資訊,設定重新分片的標記,初始化作業監聽服務,啟動調解分散式作業不一致狀態服務

elastic-job-lite優缺點

從上面的分析我想大家已經能得出一些elastic-job-lite的一些利弊資訊了,這裡我在歸納總結一下,
優點

  1. 輕量級,簡單,依賴少,只需一個zk就可以使用起來
  2. 支援多種作業型別,分片,失效轉移,錯過執行,動態新增,刪除節點
  3. 簡單的視覺化管理
  4. 方便和spring整合,springboot整合

缺點

  1. 佔用業務機器資源,資源排程和業務執行沒有解耦
  2. zk作為註冊中心不友好,不支援高可用
  3. 不支援複雜的作業管理(作業依賴),一些複雜業務場景不可使用
  4. 視覺化相對簡單,作業監控也比較簡單
  5. 對單次執行不太友好

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

本作品採用《CC 協議》,轉載必須註明作者和本文連結
那小子阿偉

相關文章