笑話:大廠都在用的任務排程框架我能不知道嗎???
阿新 • • 發佈:2020-05-08
## 前言
我之前的工作中一直在用 Elastic-Job 來做任務排程。這也是大家為什麼能在我的書籍《Spring Cloud 微服務 入門 實戰與進階》中看到 Elastic-Job 的章節。
從 2017 的 2.1.5 版本之後 Elastic-Job 沒再更新過。我們在做技術選型的時候,對框架的使用範圍和社群的活躍度都會比較看重,當然首先是功能點能夠滿足業務需求。
今天給大家新推薦一個任務排程框架,也許很多人聽過甚至目前已經使用了很久。不過沒關係,這也不影響你今天閱讀本文章。
這個框架就是 XXL-JOB,一個輕量級分散式任務排程平臺。最近在我的開源專案 Kitty-Cloud 中就採用了 XXL-JOB,還有一個原因是我目前任職的公司也一直在使用 XXL-JOB。
## XXL-JOB 的前世今生
XXL-JOB 是一個分散式任務排程平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴充套件。現已開放原始碼並接入多家公司線上產品線,開箱即用。
2015-11 月,XXL-JOB RELEASE 了第一個大版本 V1.0,在後面的幾年裡一直在更新。目前最新的版本是今年更新的 2.2.0。
### 功能特性
- 排程中心 HA(中心式)
- 執行器 HA(分散式)
- 執行器彈性擴容縮容
- 豐富的路由策略支援
- 支援高度容錯故障轉移
- 任務超時控制
- 任務失敗重試
- 任務失敗告警
- 任務動態分片
- 指令碼任務
- 等等。。。
### 豐富的 WEB 後臺
**執行報表**
![](https://img2020.cnblogs.com/blog/1618095/202005/1618095-20200508122856046-334768119.png)
**任務管理**
![](https://img2020.cnblogs.com/blog/1618095/202005/1618095-20200508122905275-365469341.png)
**WEB IDE**
![](https://img2020.cnblogs.com/blog/1618095/202005/1618095-20200508122915219-1330997548.png)
### XXL-JOB 使用場景
- 訂單超時取消
- 使用者生日關懷簡訊傳送
- 定時進行資料異構
- 每日商家結算
- 定時重新整理快取
- ....................
### XXL-JOB 架構設計
XXL-JOB 將排程行為抽象形成“排程中心”公共平臺,而平臺自身並不承擔業務邏輯,“排程中心”負責發起排程請求。
將任務抽象成分散的 JobHandler,交由“執行器”統一管理,“執行器”負責接收排程請求並執行對應的 JobHandler 中業務邏輯。
排程 和 任務 兩部分可以相互解耦,提高系統整體穩定性和擴充套件性;
如下圖,任務和排程是分開的,相互解耦。
![](https://img2020.cnblogs.com/blog/1618095/202005/1618095-20200508122927060-414962813.png)
執行器嵌入在應用中,負責接收排程請求並執行任務邏輯。應用啟動的時候會註冊到排程中心,在後臺有執行器管理功能,也可以手動新增執行器。
![](https://img2020.cnblogs.com/blog/1618095/202005/1618095-20200508122937314-283698984.png)
XXL-JOB 整體架構如下圖所示,排程中心分為任務管理,執行器管理,日誌管理等模組。
任務管理主要對任務的一些操作,包括新增任務,編輯任務,暫停任務,啟動任務等功能。
執行器管理主要對執行器的一些操作,檢視機器列表,管理線上執行器等。
日誌管理負責所有日誌*相關的儲存和展示。*
其他模組包括了一些任務執行的報表,任務失敗告警等功能。
執行器內部會暴露 Http 協議,排程中心在任務排程的時候,會向對應的執行器發起 Http 請求,執行器接收到請求後開始執行任務邏輯,執行器會回撥排程中心,反饋任務執行的結果。
![](https://img2020.cnblogs.com/blog/1618095/202005/1618095-20200508122945900-274430727.png)
## XXL-JOB 使用小技巧
### 日誌自動清理
XXL-JOB 中有排程日誌和任務執行日誌。如果任務多,排程頻繁的話日誌的資料量也挺大的,目前日誌是儲存在 Mysql 中,對應的表是 xxl_job_log。
在一開始用的時候發現 XXL-JOB 的後臺直接有清理日誌的按鈕,直接在介面上操作非常即可,可以選擇時間段清理,也還算方便。
![](https://img2020.cnblogs.com/blog/1618095/202005/1618095-20200508122954917-1015138757.png)
通過手動的方式去操作必然會帶來一個問題,就是忘記了,等到哪天卡的不行才會去清理一次,不智慧。
當時就直接寫了一個清理日誌的任務,直接對 xxl_job_log 這張表進行刪除操作,定時清理,這樣就不用人工干預了。
後面發現 XXL-JOB 居然有自動清理的配置,這就是沒仔細看文件的後果呀,通過下面的配置來決定執行器日誌檔案儲存天數。
xxl.job.executor.logretentiondays=30
### 任務自動註冊
預設情況下,我們開發了一個任務需要到 XXL-JOB 的後臺手動去新增一個任務。如果你想偷點懶的話我教你一個方式。
可以自己定義一個註解,然後專案啟動的時候掃描註解,獲取註解裡的配置,呼叫 XXL-JOB 後的 API 介面直接插入,這樣新加的任務在你啟動後就自動建立了。
### 擴充套件監控支援簡訊和釘釘
XXL-JOB 對任務的失敗告警預設只支援郵件的方式,但是提供了擴充套件的方式,需要對後臺的程式碼進行擴展才行。
可以自己動手擴充套件監控告警,比如支援釘釘訊息,簡訊等告警方式。
擴充套件程式碼位置:JobFailMonitorHelper.failAlarm
資料格式:
```
{
"emails": ["xxx.mail.com", "xxx.mail.com"],
"dingdings": [{
"access_token": " ",
"secret": ""
}],
"mobiles": ["18211110000"]
}
```
上面定義的 Json 資料格式我們可以直接用後臺目前已有的監控郵箱的文字框進行輸入,然後在
JobFailMonitorHelper 進行解析,選擇對應的傳送方式即可。
做的更友好的方式就直接把後臺的那個編輯頁面改掉,增加幾個單獨的簡訊,釘釘文字輸入框。