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. 事件追蹤查詢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章