1. 程式人生 > >分散式任務排程平臺搭建

分散式任務排程平臺搭建

分散式情況下定時任務會出現哪些問題?

分散式叢集的情況下,怎麼保證定時任務不被重複執行

分散式定時任務解決方案

①使用zookeeper實現分散式鎖 缺點(需要建立臨時節點、和事件通知不易於擴充套件)

②使用配置檔案做一個開關  缺點發布後,需要重啟

③資料庫唯一約束,缺點效率低

④使用分散式任務排程平臺XXLJOB、Elastric-Job、TBSchedule

XXLJOB介紹

1、簡單:支援通過Web頁面對任務進行CRUD操作,操作簡單,一分鐘上手;

2、動態:支援動態修改任務狀態、暫停/恢復任務,以及終止執行中任務,即時生效;

3、排程中心HA(中心式):排程採用中心式設計,“排程中心”基於叢集Quartz實現,可保證排程中心HA;

4、執行器HA(分散式):任務分散式執行,任務"執行器"支援叢集部署,可保證任務執行HA;

5、任務Failover:執行器叢集部署時,任務路由策略選擇"故障轉移"情況下排程失敗時將會平滑切換執行器進行Failover;

6、一致性:“排程中心”通過DB鎖保證叢集分散式排程的一致性, 一次任務排程只會觸發一次執行;

7、自定義任務引數:支援線上配置排程任務入參,即時生效;

8、排程執行緒池:排程系統多執行緒觸發排程執行,確保排程精確執行,不被堵塞;

9、彈性擴容縮容:一旦有新執行器機器上線或者下線,下次排程時將會重新分配任務;

10、郵件報警:任務失敗時支援郵件報警,支援配置多郵件地址群發報警郵件;

11、狀態監控:支援實時監控任務進度;

12、Rolling執行日誌:支援線上檢視排程結果,並且支援以Rolling方式實時檢視執行器輸出的完整的執行日誌;

13、GLUE:提供Web IDE,支援線上開發任務邏輯程式碼,動態釋出,實時編譯生效,省略部署上線的過程。支援30個版本的歷史版本回溯。

14、資料加密:排程中心和執行器之間的通訊進行資料加密,提升排程資訊保安性;

15、任務依賴:支援配置子任務依賴,當父任務執行結束且執行成功後將會主動觸發一次子任務的執行, 多個子任務用逗號分隔;

16、推送maven中央倉庫: 將會把最新穩定版推送到maven中央倉庫, 方便使用者接入和使用;

17、任務註冊: 執行器會週期性自動註冊任務, 排程中心將會自動發現註冊的任務並觸發執行。同時,也支援手動錄入執行器地址;

18、路由策略:執行器叢集部署時提供豐富的路由策略,包括:第一個、最後一個、輪詢、隨機、一致性HASH、最不經常使用、最近最久未使用、故障轉移、忙碌轉移等;

19、執行報表:支援實時檢視執行資料,如任務數量、排程次數、執行器數量等;以及排程報表,如排程日期分佈圖,排程成功分佈圖等;

20、指令碼任務:支援以GLUE模式開發和執行指令碼任務,包括Shell、Python等型別指令碼;

21、阻塞處理策略:排程過於密集執行器來不及處理時的處理策略,策略包括:單機序列(預設)、丟棄後續排程、覆蓋之前排程;

22、失敗處理策略;排程失敗時的處理策略,策略包括:失敗告警(預設)、失敗重試;

23、分片廣播任務:執行器叢集部署時,任務路由策略選擇"分片廣播"情況下,一次任務排程將會廣播觸發對應叢集中所有執行器執行一次任務,同時傳遞分片引數;可根據分片引數開發分片任務;

24、動態分片:分片廣播任務以執行器為維度進行分片,支援動態擴容執行器叢集從而動態增加分片數量,協同進行業務處理;在進行大資料量業務操作時可顯著提升任務處理能力和速度。

25、事件觸發:除了"Cron方式"和"任務依賴方式"觸發任務執行之外,支援基於事件的觸發任務方式。排程中心提供觸發任務單次執行的API服務,可根據業務事件靈活觸發。

 

XXLJOBGitHub地址

https://github.com/xuxueli/xxl-job

 

文件

http://www.xuxueli.com/xxl-job/#/?id=_21-%e5%88%9d%e5%a7%8b%e5%8c%96%e8%b0%83%e5%ba%a6%e6%95%b0%e6%8d%ae%e5%ba%93

 

傳統定時任務特徵: 單點系統(Job不需叢集) 

如果定時Job在高併發情況下宕機怎麼辦?

定時任務程式碼 和 業務執行的 伺服器獨立的  獨立的Jvm

     如果同一時間點執行多個任務,考慮高併發。同時執行的情況

解決方案: 心跳檢測自動重啟,補償機制(每個任務打一個小標記) 定時任務在執行時候突然報錯,日誌紀律,跳過繼續執行。

再使用定時Jbo掃描日誌記錄,程序補償資訊。

 

 

定時任務 三個war包 分別放在三臺伺服器上。定時Job可能會重複執行三次。分散式Job冪等性。

     1、使用zk實現分散式鎖

        只有獲取到鎖的 才可以執行Job (效率低)

     2、配置檔案中加啟動定時Job的開關

      三個war包程式碼相同。 war1 加開關flag=true    war2 加開關flag=fasle  war3 加開關flag=true   為true的才可以執行

    3、啟動時候使用資料庫唯一標識

         啟動時候 表裡插入資料 成功的才可以執行 

 

分散式任務排程平臺推薦使用

 XXL_Job  和 ELastric-Job(依賴zk)

 

 

保證冪等性

1、支援Job叢集(前提保證冪等性) Jbo負載均衡輪詢機制

比如:

第一次 8080

第二次 8081

第三次 8082

2、支援Job補償 Job失敗,重試,多次失敗發郵件。

3、支援Job日誌記錄

4、動態配置定時規則,傳統定時Jbo出發規則寫死,採用動態方式。

 

 

XXL-Job原理:

   執行器:定時Job實際執行的伺服器地址

   任務管理:定時任務規則,路由策略,允許模式等

 

步驟:

①  部署: xxl-job-admin  作為註冊中心

②  建立執行器(具體排程地址) 可以支援叢集

③  配置檔案需要填寫xxl-job註冊中心地址

④  每個具體執行job伺服器需要建立一個netty連線埠號

⑤  需要執行job的任務類,整合IJobHandler抽象類註冊到job容器中

⑥  Execute方法中編寫具體job任務

                                            

1、XXL-Job admin 平臺建立執行器(Job實際執行地址)

2、XXL-Job admin 平臺建立任務,填寫對應的執行器

3、Jbo伺服器程式碼中,使用JobHandler表示該類為Job執行方法

 

如果有任務需要執行的時候,先再XXL-Job admin執行一次,獲取任務中執行器

 

下載: 

https://github.com/xuxueli/xxl-job

下載 然後倒入到自己的工程裡面

引入後:

 匯入資料:跑一邊

 

 匯入:

 

修改:

把admin引入 

方法:

  右鍵:

點選add and remove 即可

啟動:

 

 

 

 訪問:http://localhost:8080/xxl-job-admin/

 

 看客戶端的demo