官方文檔: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. 事件追蹤查詢