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是以zookeeper作為註冊中心的,console作為控制檯和服務端解構,直接操縱zk改變job的配置資訊,服務端啟動時連線zk,註冊job,初始化Scheuler,進行leader選舉,分片,然後按照job配置資訊排程作業,支援作業執行中的監控,event傳送,失敗轉移等
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支援三種作業型別,我們可以根據自己的業務需求選擇合適作業型別
- 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作業配置的類圖是這樣的:
我們分析上面類圖:
- JobCoreConfiguration類定義了job作業核心配置屬性
- JobTypeConfiguration, Job型別的配置介面,有三個實現類,對應上面三種型別的作業,JobTypeConfiguration介面定義了獲取JobCoreConfiguration類的方法
- JobRootConfiguration, Job跟配置介面,定義了獲取JobTypeConfiguration實現類的方法
- LiteJobConfiguration類實現了JobRootConfiguration介面
接下來我們分析這寫類中定義的job配置屬性,我整理完成後截圖如下:
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中一個任務的執行流程,從quartz中一個job執行執行緒開始,呼叫LiteJob的execute方法,緊接著根據job的型別建立JobExecutor,開始執行jobExecutor,根據模板設計模式,父類AbstractExecutor規定了job的執行流程,子類重寫了具體不同job型別執行時的同邏輯。
描述一下各個方法的作用
- checkJobExecutionEnvironment檢查作業執行環境
- getShardingContext獲取作業的分片的上下文
- postJobStatusTraceEvent傳送作業狀態跟蹤時間
- misfireRunning錯過執行檢查和設定
- beforeJobExecuted作業執行前監聽器執行
- execute執行作業
- isExecuteMisfired是否執行錯過執行
- failoverIfNecessary失效轉移是否執行
- afterJobExecuted作業執行後監聽器執行
elastic-job-lite啟動流程
首先啟動連線註冊中心k,並且進行初始化,建立zk客戶端,接著作業排程器JobScheduler,執行排程器的init方法,在init方法中做如下事情
- 往註冊中心更新jobConfig
- 建立job調取器控制中心
- 註冊job
- 註冊job啟動資訊,這一步裡面又做了很多事情,開啟關於job的zk監聽器,主節點選舉,持久化作業伺服器上線資訊,持久化作業執行例項資訊,設定重新分片的標記,初始化作業監聽服務,啟動調解分散式作業不一致狀態服務
elastic-job-lite優缺點
從上面的分析我想大家已經能得出一些elastic-job-lite的一些利弊資訊了,這裡我在歸納總結一下,
優點
- 輕量級,簡單,依賴少,只需一個zk就可以使用起來
- 支援多種作業型別,分片,失效轉移,錯過執行,動態新增,刪除節點
- 簡單的視覺化管理
- 方便和spring整合,springboot整合
缺點
- 佔用業務機器資源,資源排程和業務執行沒有解耦
- zk作為註冊中心不友好,不支援高可用
- 不支援複雜的作業管理(作業依賴),一些複雜業務場景不可使用
- 視覺化相對簡單,作業監控也比較簡單
- 對單次執行不太友好
本作品採用《CC 協議》,轉載必須註明作者和本文連結