1. 程式人生 > >Elastic-Job學習筆記-定時任務框架的搭建

Elastic-Job學習筆記-定時任務框架的搭建

官方文件:http://elasticjob.io/docs/elastic-job-lite/00-overview/
elastic-job學習(網易樂得技術團隊,具體說明) http://tech.lede.com/2017/06/23/rd/server/elasticJob/

1.簡介

Elastic-Job-Lite定位為輕量級無中心化解決方案,使用jar包的形式提供最輕量級的分散式任務的協調服務,外部依賴僅Zookeeper。
使用的時候,只需要在專案中引入相應的maven配置即可。

2.核心理念

2.1 分散式排程

Elastic-Job-Lite並無作業排程中心節點,而是基於部署作業框架的程式在到達相應時間點時各自觸發排程。
註冊中心僅用於作業註冊和監控資訊儲存。而主作業節點僅用於處理分片和清理等功能。

2.2 作業高可用

Elastic-Job-Lite提供最安全的方式執行作業。將分片總數設定為1,並使用多於1臺的伺服器執行作業,作業將會以1主n從的方式執行。
一旦執行作業的伺服器崩潰,等待執行的伺服器將會在下次作業啟動時替補執行。開啟失效轉移功能效果更好,可以保證在本次作業執行時崩潰,備機立即啟動替補執行。

2.3 最大限度利用資源

Elastic-Job-Lite也提供最靈活的方式,最大限度的提高執行作業的吞吐量。將分片項設定為大於伺服器的數量,最好是大於伺服器倍數的數量,作業將會合理的利用分散式資源,動態的分配分片項。
例如:3臺伺服器,分成10片,則分片項分配結果為伺服器A=0,1,2;伺服器B=3,4,5;伺服器C=6,7,8,9。 如果伺服器C崩潰,則分片項分配結果為伺服器A=0,1,2,3,4;伺服器B=5,6,7,8,9。在不丟失分片項的情況下,最大限度的利用現有資源提高吞吐量。

3.整體架構圖

在這裡插入圖片描述

4.主要功能

在這裡插入圖片描述

5.作業啟動流程圖

在這裡插入圖片描述
(1)第一臺伺服器上線觸發主伺服器選舉。主伺服器一旦下線,則重新觸發選舉,選舉過程中阻塞,只有主伺服器選舉完成,才會執行其他任務。
(2)某作業伺服器上線時會自動將伺服器資訊註冊到註冊中心,下線時會自動更新伺服器狀態。
(3)主節點選舉,伺服器上下線,分片總數變更均更新重新分片標記。
(4)定時任務觸發時,如需重新分片,則通過主伺服器分片,分片過程中阻塞,分片結束後才可執行任務。如分片過程中主伺服器下線,則先選舉主伺服器,再分片。
(5)通過(4)可知,為了維持作業執行時的穩定性,執行過程中只會標記分片狀態,不會重新分片。分片僅可能發生在下次任務觸發前。
(6)每次分片都會按伺服器IP排序,保證分片結果不會產生較大波動。
(7)實現失效轉移功能,在某臺伺服器執行完畢後主動抓取未分配的分片,並且在某臺伺服器下線後主動尋找可用的伺服器執行任務。

6.作業執行流程圖

在這裡插入圖片描述

7.環境說明

Java 1.7 +
zookeeper 3.4.6 +
maven 3.0.4 +

8.引入MAVEN

<!--定時任務框架依賴-->
<dependency>
	<artifactId>elastic-job-lite-core</artifactId>
	<groupId>com.dangdang</groupId>
	<version>${elastic-job.version}</version>
</dependency>
<dependency>
	<artifactId>elastic-job-common-core</artifactId>
	<groupId>com.dangdang</groupId>
	<version>${elastic-job.version}</version>
</dependency>
<dependency>
	<artifactId>curator-framework</artifactId>
	<groupId>org.apache.curator</groupId>
	<version>2.10.0</version>
</dependency>
<dependency>
	<artifactId>curator-recipes</artifactId>
	<groupId>org.apache.curator</groupId>
	<version>2.10.0</version>
	<exclusions>
		<exclusion>
			<artifactId>curator-framework</artifactId>
			<groupId>org.apache.curator</groupId>
		</exclusion>
	</exclusions>
</dependency>

<dependency>
	<artifactId>elastic-job-lite-spring</artifactId>
	<groupId>com.dangdang</groupId>
	<version>${elastic-job.version}</version>
</dependency>
<!--定時任務框架依賴結束-->

9.作用開發

新建一個類,繼承 SimpleJob或者Dataflow
SimpleJob
意為簡單實現,未經任何封裝的型別。需實現SimpleJob介面。該介面僅提供單一方法用於覆蓋,此方法將定時執行。與Quartz原生介面相似,但提供了彈性擴縮容和分片等功能。
Dataflow
Dataflow型別用於處理資料流,需實現DataflowJob介面。該介面提供2個方法可供覆蓋,分別用於抓取(fetchData)和處理(processData)資料。
可通過DataflowJobConfiguration配置是否流式處理。
流式處理資料只有fetchData方法的返回值為null或集合長度為空時,作業才停止抓取,否則作業將一直執行下去; 非流式處理資料則只會在每次作業執行過程中執行一次fetchData方法和processData方法,隨即完成本次作業。
如果採用流式作業處理方式,建議processData處理資料後更新其狀態,避免fetchData再次抓取到,從而使得作業永不停止。 流式資料處理參照TbSchedule設計,適用於不間歇的資料處理。

在com.wsk.timer.job中建立相應的類。
eg。

import com.alibaba.fastjson.JSON;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

/**
* @DESCRIPTION : 這是一個測試類
* @AUTHOR : WuShukai
* @TIME : 2018/9/18 15:42
*/
public class TestJob implements SimpleJob {

    private static final Logger log = LoggerFactory.getLogger(TestJob.class);

    @Override
    public void execute(ShardingContext shardingContext) {
        log.info(JSON.toJSONString(shardingContext, true));
        for (int i = 0; i < 5; i++) {
            System.out.println("testJob=====>go: " + i +" , " + new Date());
            try {
                Thread.sleep(1000 * 4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

10.作業啟動配置(目前使用spring配置啟動)

corn 表示式網站 http://cron.qqe2.com/
在spring-job.xml中宣告job,並配置。

<!--測試用例-->
<job:simple registry-center-ref="regCenter" cron="0/30 * * * * ?" sharding-total-count="1" id="testJob"
    class="com.gw.timer.job.TestJob" overwrite="true" failover="true"
job-sharding-strategy-class="com.gw.timer.strategy.FirstJobShardingStrategy"/>

11.註冊中心配置

11.1 reg:zookeeper名稱空間屬性詳細說明
屬性名 型別 是否必填 預設值 描述
id String 註冊中心在Spring容器中的主鍵
server-lists String 連線Zookeeper伺服器的列表,包括IP地址和埠號,多個地址用逗號分隔,如: host1:2181,host2:2181
namespace String Zookeeper的名稱空間
base-sleep-time-milliseconds int 1000 等待重試的間隔時間的初始值,單位:毫秒,
max-sleep-time-milliseconds int 3000 等待重試的間隔時間的最大值,單位:毫秒
max-retries int 3 最大重試次數
session-timeout-milliseconds int 60000 會話超時時間,單位:毫秒,
connection-timeout-milliseconds int 15000 連線超時時間
digest String 連線Zookeeper的許可權令牌,預設為不需要許可權驗證
11.2 job:simple名稱空間屬性詳細說明
屬性名 型別 是否必填 預設值 描述
id String 作業名稱
class String 作業實現類,需實現ElasticJob介面
job-ref String 作業關聯的beanId,該配置優先順序大於class屬性配置
registry-center-ref String 註冊中心Bean的引用,需引用reg:zookeeper的宣告
cron String cron表示式,用於控制作業觸發時間
sharding-total-count int 作業分片總數
sharding-item-parameters String 分片序列號和引數用等號分隔,多個鍵值對用逗號分隔,分片序列號從0開始,不可大於或等於作業分片總數,如:,0=a,1=b,2=c
job-instance-id String defaultInstance 作業例項主鍵,同IP可執行例項主鍵不同, 但名稱相同的多個作業例項
job-parameter String 作業自定義引數,作業自定義引數,可通過傳遞該引數為作業排程的業務方法傳參,用於實現帶引數的作業,例:每次獲取的資料量、作業例項從資料庫讀取的主鍵等
monitor-execution boolean true 監控作業執行時狀態,每次作業執行時間和間隔時間均非常短的情況,建議不監控作業執行時狀態以提升效率。因為是瞬時狀態,所以無必要監控。請使用者自行增加資料堆積監控。並且不能保證資料重複選取,應在作業中實現冪等性。每次作業執行時間和間隔時間均較長的情況,建議監控作業執行時狀態,可保證資料不會重複選取。
monitor-port int -1 作業監控埠,建議配置作業監控埠, 方便開發者dump作業資訊。,使用方法: echo “dump”
max-time-diff-seconds int -1 最大允許的本機與註冊中心的時間誤差秒數,如果時間誤差超過配置秒數則作業啟動時將拋異常,配置為-1表示不校驗時間誤差
failover boolean false 是否開啟失效轉移
misfire boolean true 是否開啟錯過任務重新執行
job-sharding-strategy-class String 作業分片策略實現類全路徑,預設使用平均分配策略,詳情參見:作業分片策略
description String 作業描述資訊
disabled boolean false 作業是否禁止啟動,可用於部署作業時,先禁止啟動,部署結束後統一啟動
overwrite boolean false 本地配置是否可覆蓋註冊中心配置,如果可覆蓋,每次啟動作業都以本地配置為準
job-exception-handler String 擴充套件異常處理類
executor-service-handler String 擴充套件作業處理執行緒池類
reconcile-interval-minutes int 10 修復作業伺服器不一致狀態服務排程間隔時間,配置為小於1的任意值表示不執行修復,單位:分鐘
event-trace-rdb-data-source String 作業事件追蹤的資料來源Bean引用
11.3 job:dataflow名稱空間屬性詳細說明
屬性名 型別 是否必填 預設值 描述
streaming-process boolean false 是否流式處理資料,如果流式處理資料, 則fetchData不返回空結果將持續執行作業,如果非流式處理資料, 則處理資料完成後作業結束

12.部署指南

12.1 應用部署

a. 啟動Elastic-Job-Lite指定註冊中心的Zookeeper。
b. 執行包含Elastic-Job-Lite和業務程式碼的jar檔案。不限與jar或war的啟動方式。

12.2 運維平臺部署(可選)

a. 編譯job-console.tar.gz,可通過mvn install編譯獲取。
b. 解壓縮job-console.tar.gz並執行bin\start.sh
c. 開啟瀏覽器訪問http://localhost:8899/即可訪問控制檯。8899為預設埠號,可通過啟動指令碼輸入-p自定義埠號。

12.3 運維平臺功能

a. 登入安全控制
b. 註冊中心、事件追蹤資料來源管理
c. 快捷修改作業設定
d. 作業和伺服器維度狀態檢視
e. 操作作業禁用\啟用、停止和刪除等生命週期
f. 事件追蹤查詢