因現有系統的排程系統對作業的生命週期,執行軌跡與狀態監控和報警,無統一的管理和資源規劃;導致運維維護困難、排程與執行耦合性嚴重、開發不規範、作業週期設定不合理等因素帶來的一系列定位問題困難,人工干預困難及資源控制不合理的問題;調研了幾項比較熱門的開源的分散式排程系統,最後因某些原因,選擇了自研;
Elastic Job主要功能的
A. 開源地址 github.com/elasticjob/…
B. Elastic Job文件 elasticjob.io/docs/elasti…
C. Bug列表 github.com/elasticjob/…
支援功能項 | 待改造專案 | Elastic Job |
---|---|---|
動態管理Job生命週期 | 否 | 是 |
直觀展示Job的web頁面 | 否 | 是 |
Misfire功能 | 否 | 是 |
Job容錯Failover功能 | 否 | 是 |
HA | 否 | 是 |
跟蹤Job執行軌跡 | 否 | 是 |
執行緒是否可控 | 是 | 否 |
Elastic Job 主要支援功能項列表
A. 支援Job生命週期的管理
- 提供全部的job列表,支援Job的線上搜尋及統計,並直觀的展現Job的執行狀態
- 支援對Job直接觸發;動態的暫停,失效,及修改Job資訊(Cron表示式,分片總數,攜帶自定義引數,是否失效轉移,是否開啟錯過執行等主要的資訊的動態修改);
B. 支援Job Fail Over 失效轉移的策略
- 當執行Job A的所在機器 Task Server A 當機後,如果開啟失效轉移,Job A會立即選擇一個備機 Task Server B上補償 執行 Job A;
- 觸發重新選舉,選擇由哪臺Task Server來執行 Job A;
C. 支援分散式排程協調,確保在job在分散式環境下執行的冪等性
- 確保一個Job在分散式環境下只有一臺Task Server 在執行(注意事項),採用熱備方式保證HA
- 通過zk leader選舉,leader協調分散式環境下的Job,執行分片和清理分片
D. 支援Job MisFire 錯過重新執行策略
- 開啟Misfire和 Monitor-Execution後,當Job B 1執行時,發現Job B2正在執行,為Job B2設定Misfire標誌,當Job B1執行完比後執行 Job B2
E. 支援Job執行軌跡的記錄
- 提供了事件追蹤功能,可通過事件訂閱的方式處理排程過程的重要事件,用於查詢、統計和監控。Elastic-Job目前提供了基於關係型資料庫兩種事件訂閱方式記錄事件
F. 支援豐富的作業型別
- Simple 型別 一般Job採用此方式
- Dataflow 型別 : 以流式方式處理業務邏輯
- Script型別 : 以指令碼方式建立Job
G. 支援作業並行排程
- 同一Job在執行時,可以以多例項執行;只需要指定不同的job name;
H. 支援定製化處理
- 支援定製化的異常處理
- 支援定製化的執行緒池處理
Elastic Job 操作時需要注意的問題
A. 業冪等性操作的問題
- 開啟monitorExecution才能實現分散式作業冪等性(即不會在多個作業伺服器執行同一個分片)的功能,但monitorExecution對短時間內執行的作業(如每5秒一觸發)會造成Job堆積的情況;效能影響較大,建議關閉並自行實現冪等性;同樣不建議開啟misfire,對zk效能有影響;
- 重啟全部作業機器時,如果開啟失效轉移,一些特定的業務場景需要手動清除此作業的Failover資料節點,避免重啟時候作業機器開始執行被標記為failover的作業;
Elastic Job 目前存在問題
A. 間隔短的Job冪等性問題需要業務程式碼去控制;
B. 效能問題:一個分片為1的Job,產生執行緒數為4個,一個執行分片的Job執行緒數為 4 + 可執行核數*2;需要修改原始碼規範執行緒使用;
C. Tomcat正常關閉(非 kill)的情況下,提醒記憶體洩露,執行緒池中的執行緒和排程執行緒未被銷燬;此問題因建立Schduler時未指定容易銷燬時關閉排程,導致排程執行緒未終止;修改原始碼JobScheduler指定銷燬動作即可;
D. 分散式一次監聽AbstractDistributeOnceElasticJobListener在併發下存在不可用問題;此問題通過修改原始碼已經修復;
E. 短頻執行的任務不適合開啟監聽和事件跟蹤;
架構設計
A. 環境說明
- Job配置儲存:xml儲存/java程式碼配置/scrip配置
- 外部依賴zookeeper( 3.4.6及其以上版本);實現master選舉,分散式協調/通知,分散式佇列,分散式鎖
- JDK 1.7以上版本
- Maven3.0.4及其以上版本
B. 模組說明
- Registry註冊中心提供Job config,Job instance,Job status 儲存;提供Rest API方便外部應用(Console)對Job生命週期進行統一控制;如:獲取Job資訊及執行資訊,更新Job配置資訊,暫停或禁止Job執行等操作
- Console提供視覺化頁面,採集Job列表,配置資訊,執行資訊,分片狀態,Job事件資訊及Job命令下發;
- Lite 作為Elastic Job的起承轉合:主要負責 作業機器(Job instance)選主,作業分片,作業建立,作業註冊,作業啟動/暫停/禁止/misfire/failover;並通過一些列的Listener完成zookeeper節點變化的監聽,實現當機自動切換,失效轉移,命令下發等功能;基於事件監聽實現Job執行軌跡的跟蹤;
C. 啟動流程
D. 作業執行
專案部署
A. 應用部署
- 啟動Elastic-Job-Lite指定註冊中心的Zookeeper
- 執行包含Elastic-Job-Lite和業務程式碼的jar檔案。不限與jar或war的啟動方式
B. 運維部署
- 解壓縮elastic-job-lite-console-${version}.tar.gz並執行bin\start.sh
- 開啟瀏覽器訪問http://localhost:8899/即可訪問控制檯。8899為預設口號,可通過啟動指令碼輸入-p自定義埠號。
- 訪問RESTFul API方法同控制檯
- elastic-job-lite-console-${version}.tar.gz可通過mvn install編譯獲取
其他開源的分散式排程框架
- LTS github.com/ltsopensour…
- Antares github.com/ihaolin/ant…
- opencron www.oschina.net/news/83951/…
- XXL-JOB github.com/xuxueli/xxl…
- Uncode-Schedule github.com/rabbitgyk/u…
- SchedulerX jm.taobao.org/2016/07/28/… 等
後續會帶來Elastic Job和Quarzt的原始碼解析