xxl-job
在公司也是做基礎架構項目的,所以免不了改造市場上一些優秀的開源組件,今天我們來看看這款定時任務調度中心xxl-job。xxl-job定時任務調度中心是業界非常流行的開源的輕量級分布式定時任務調度平台,最初是由美團點評的大神許雪里開發的,當然,現在已經有一個團隊在開發了,而且社區發展的很好,版本也在不斷更新,也有很多優秀的作品,有興趣的可以去XXL項目主頁看看.
基礎信息
為什么要用定時任務平台來做定時任務
在springboot中,我們可以通過@Scheduled注解來實現定時任務,但是當部署模式Wie分布式,多機部署時,就會出現任務重復執行的問題,當然我們可以通過某些手段來讓它只執行一次,比如redis分布式鎖,這個我們后邊討論。選用一個定時任務調度中心,不但可以解決分布式的問題,而且它還可以實現動態配置,以及日志查看,等一些優秀的功能。
特性
定時任務組件也有許多,但有些顯得過於重量級,比如當當開源的elastic-job,功能相對豐富,支持擴展多,但重量級的必然會有一些繁瑣的東西,比如部署麻煩,閱讀困難,改造成本相對較大。所以公司業務需求綜合對比之下,前輩選用了xxl-job作為基礎進行改造升級。
xxl-job的特性如下:
xxl-job在2.0以前的版本底層用的還是基於quartz框架實現的定時任務,而quartz本身就是apache收錄的開源分布式定時任務框架,quartz實現分布式的原理基於數據庫鎖實現的。有興趣的可以查看看。
使用調度平台的一個好處是可以集中查看日志與調度信息,使得定位問題更加便捷。
xxl-job架構如下:job核心模塊分為job將后管平台(圖中所示調度中心)和執行jar包(圖中所示執行器),並將它們各自分離,需要使用到定時任務的業務系統首先添加jar包依賴項,然后做一些本地開發配置之后,到調度中心后管上進行配置定時任務相關信息即可。
后管平台包含quartz模塊,也是觸發任務的核心所在,具體執行任務的模塊在接入jar包中,它們之間通過TCP進行通信,其實業務方接入jar包模塊實則是在嵌入一個Jetty容器,讓容器與業務應用同時運行。
執行過程
配置完成后,一次完整的執行示意圖如下:
- 執行器(客戶端),先寫配置信息,在調度中心后管增加執行器AppName,客戶端啟動時會在客戶端啟動一個Jetty容器用來執行任務,執行器通過心跳機制向調度中心自動注冊服務,掃描Jobhandler任務
- 后管配置任務基本信息,入庫儲存,保存quartz觸發的配置信息
- 觸發調度:
- 調度中心拉取任務基本配置信息,生成調度信息
- 加載相應的注冊的執行器線程,組建任務觸發信息,放入隊列等待執行
- 生成日志記錄線程
- 根據Jobhandler執行客戶端業務邏輯任務
- 回調執行結果
- 異步記錄執行日志信息,生成日志文件
結尾
至此,一次完整的任務調度就完成了,基本信息應該就是如此了,本篇文章沒有深入的去代碼分析,后續我們我再寫文章認真分析執行流程以及我所改造后的日志文件生成體系。