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