先簡單介紹下分布式定時任務調度框架的使用場景和功能和架構,然后再介紹世面上常見的產品
我們在大型的復雜的系統下,會有大量的跑批,定時任務的功能,如果在獨立的子項目中單獨去處理這些任務,隨著業務的復雜度的提高,大量的任務將很難進行統一的管理,出現bug以后問題也很難排查,最后將成為一種災難。所以我們引入了分布式定時任務調度框架,統一管理這些定時任務和跑批的功能,出現問題也容易統一管理
1. 分布式定時任務功能
1.1 定時任務的執行、任務管理、執行日志管理
1.2 定時任務架構的高可用。集群、分片、執行失敗任務的處理
1.3 一些擴展功能:可視化的運維,多語言支持、任務編排等
2. 調度中心的整體架構
一個分布式定時任務框架主要分為下面三個模塊
2.1 調度中心: 負責接收并分配任務,并按照置頂的配置規則執行
2.2 任務執行: 處理實際業務處理并執行,執行完成以后反饋給調度中心
2.3 監控中心: 主要負責節點管理,任務隊列管理,監控管理等。
常見的分布式調度框架:xxljob
xxl-job是我極力推薦的框架,在我待過的幾家中小型的互聯網公司基本上都選用該框架。xxl-job開放源碼,簡單高效,中小企業用的很多。
1.xxl-job經過持續的迭代,修復了很多bug。2.0開始引入新特性,耦合性降低
2.搭建起來也非常簡單,開箱即用。
3.源碼開放
4.源碼也有很多值得學習的地方,雖然剛發布的時候會有很多資深的程序員詬病,但經過多年的發展維護,已經非常穩定。代碼非常樸實,沒有那些花里胡哨的花樣
xxl-job架構如下圖
調度中心: 用于發布我們需要的執行任務,并且可以控制任務的添加、刪除、啟動和停止,以及維護日志。并且可以在操作界面進行設置。
執行器: 執行具體業務端,調度中心根據注冊的執行器,按照算法分配任務執行。每一個執行器有唯一的appname,與調度中心管理的執行器名稱一致,調度中心才分配任務給執行器
任務: 設置執行策略、分片機制、任務、執行器等信息。執行器管理中的appname找到執行器的appname,這樣任務就會分配給對應的執行器。
xxl-job的調度原理:
1.調度中心通過http協議請求執行器中的服務,默認的端口是9999
2.執行器執行業務邏輯代碼
3.執行器執行完成業務代碼后回調調度中心的服務,調度中心開放了一套針對執行器材的API
xxl-job的分片原理
當執行器以集群方式部署的情況下,調度任務的策略選擇"分片廣播"的情況下,一次調度任務會以廣播的形勢觸發集群中所有的執行器,同時傳遞分片參數,可以根據分片參數開發分片任務。
xxl-job的架構雖然簡單但是用起來是真的爽,沒有那一套高大上的架構設計,但是就是好用
常見的分布式調度架構:elastic-job
elastic-job分為兩個獨立的大塊。一個是lite-core(核心去中心化的調度),一個是cloud(監控平臺).
schedule: 會選取一個leader,作為分配執行任務的(包括分片)的機器。
simple: 實現simplejob接口,該接口提供單一的方法覆蓋,該方法定時執行并提供了彈性擴容和分片的功能
dataflow: dataflow類型用于處理數據流,需實現DataflowJob接口。該接口提供2個方法可供覆蓋,分別用于抓取(fetchData)和處理(processData)數據
script: script類型作業意為腳本類型作業,支持shell,python,perl等所有類型腳本。只需通過控制臺或代碼配置scriptCommandLine即可,無需編碼。執行腳本路徑可包含參數,參數傳遞完畢后,作業框架會自動追加最后一個參數為作業運行時信息。
調度原理
elastic-job的分布式鎖
通過zookeeper做的分布式鎖,先選取leader再做分配工作
常見的分布式調度框架:Schedulerx2.0
分布式任務調度SchedulerX是阿里巴巴自研的基于Akka架構的分布式任務調度平臺,兼容開源XXL-JOB、ElasticJob,支持Cron定時、一次性任務、任務編排、分布式執行批量任務等功能,具備高可用、可視化、可運維、低延時等能力。如下圖所示;
常見分布式調度框架:quartz
整體架構圖如下:
常見的分布式調度框架:LTS
使用容器化的技術,定時啟動執行器執行任務。
我們使用圖表方式對以上幾個框架做個總結
一般情況下中小型的業務的首選就是xxl-job。