定時任務框架選型
1.quartz
quartz 的常見集群方案如下,通過在數(shù)據(jù)庫中配置定時器信息, 以數(shù)據(jù)庫悲觀鎖的方式達到同一個任務始終只有一個節(jié)點在運行
優(yōu)點
· 保證節(jié)點高可用 (HA), 如果某一個幾點掛了, 其他節(jié)e 點可以頂上
缺點
- 同一個任務只能有一個節(jié)點運行,其他節(jié)點將不執(zhí)行任務,性能低,資源浪費
- 當碰到大量短任務時,各個節(jié)點頻繁的競爭數(shù)據(jù)庫鎖,節(jié)點越多這種情況越嚴重。性能會很低下
- quartz 的分布式僅解決了集群高可用的問題,并沒有解決任務分片的問題,不能實現(xiàn)水平擴展
結論:quartz作為開源作業(yè)調(diào)度中的佼佼者,是作業(yè)調(diào)度的首選,但是因為存在一些問題,其他的定時任務框架有好多是基于quartz做的拓展式的開發(fā),能夠體現(xiàn)quartz作為作業(yè)調(diào)度的作用,同事也彌補了其缺陷,所以,暫時不考慮
2.light-task-scheduler
框架概況
LTS(light-task-scheduler)主要用于解決分布式任務調(diào)度問題,支持實時任務,定時任務和Cron任務。有較好的伸縮性,擴展性,健壯穩(wěn)定性而被多家公司使用。
LTS 有主要有以下四種節(jié)點:
- JobClient:主要負責提交任務, 并接收任務執(zhí)行反饋結果。
- JobTracker:負責接收并分配任務,任務調(diào)度。
- TaskTracker:負責執(zhí)行任務,執(zhí)行完反饋給JobTracker。
- LTS-Admin:(管理后臺)主要負責節(jié)點管理,任務隊列管理,監(jiān)控管理等。
其中JobClient,JobTracker,TaskTracker節(jié)點都是無狀態(tài)的。 可以部署多個并動態(tài)的進行刪減,來實現(xiàn)負載均衡,實現(xiàn)更大的負載量, 并且框架采用FailStore策略使LTS具有很好的容錯能力。
LTS注冊中心提供多種實現(xiàn)(Zookeeper,redis等),注冊中心進行節(jié)點信息暴露,master選舉。(Mongo or Mysql)存儲任務隊列和任務執(zhí)行日志, netty or mina做底層通信, 并提供多種序列化方式fastjson, hessian2, java等。
LTS支持任務類型:
- 實時任務:提交了之后立即就要執(zhí)行的任務。
- 定時任務:在指定時間點執(zhí)行的任務,譬如 今天3點執(zhí)行(單次)。
- Cron任務:CronExpression,和quartz類似(但是不是使用quartz實現(xiàn)的)譬如 0 0/1 * * * ?
支持動態(tài)修改任務參數(shù),任務執(zhí)行時間等設置,支持后臺動態(tài)添加任務,支持Cron任務暫停,支持手動停止正在執(zhí)行的任務(有條件),支持任務的監(jiān)控統(tǒng)計,支持各個節(jié)點的任務執(zhí)行監(jiān)控,JVM監(jiān)控等等.
架構圖
流程圖
結論:集群部署,支持分片,git上有較完善的文檔,有可視化界面,由阿里提供,具有比較完善的拓展方式,功能也較完善,但是已經(jīng)三年沒有維護,原則上要選擇社區(qū)活躍的架構,所以不考慮
3.antares
?Antares特性
基于Quartz的分布式調(diào)度
- 一個任務僅會被服務器集群中的某個節(jié)點調(diào)度,調(diào)度機制基于成熟的Quartz,antares內(nèi)部會重寫執(zhí)行邏輯;
并行執(zhí)行
- 用戶可通過對任務預分片,有效提升任務執(zhí)行效率;
失效轉(zhuǎn)移
- 客戶端實效轉(zhuǎn)移:當某個客戶端實例在執(zhí)行任務中宕機時,其正在執(zhí)行的分片將重新由其他客戶端實例執(zhí)行;
- 服務器失效轉(zhuǎn)移:當服務器集群中某個節(jié)點宕機時,其正在調(diào)度的任務將轉(zhuǎn)移到其他節(jié)點去調(diào)度;
彈性擴容
- 客戶端擴容:客戶端可通過增加應用實例,提升任務執(zhí)行的效率;
- 服務器擴容:服務器集群可通過增加節(jié)點,提升集群任務調(diào)度的服務能力;
進程級的應用實例
- antares通過ip+進程號標識客戶端應用實例,因此支持單機多應用實例部署;
任務依賴
- antares支持樹形任務依賴,當某任務執(zhí)行完成后,會通知其后置任務執(zhí)行;
任務報警
- antares支持基本的任務超時報警,失敗報警等;
管理控制臺
- 用戶可通過控制臺antares-tower對任務進行基本操作,如觸發(fā),暫停,監(jiān)控等。
Antares架構
結論:集群部署,以zk為注冊中心,支持分片,git上有較完善的文檔,有可視化見面,可彈性擴容,用redis來做持久化,基本功能也完備,但是已經(jīng)三年沒有維護,原則上要選擇社區(qū)活躍的架構,所以不考慮
4.opencron
一個功能完善真正通用的linux定時任務調(diào)度定系統(tǒng),滿足多種場景下各種復雜的定時任務調(diào)度,同時集成了linux實時監(jiān)控,webssh,提供一個方便管理定時任務的平臺.
缺點
- 僅支持 kill任務, 現(xiàn)場執(zhí)行,查詢?nèi)蝿者\行狀態(tài) 等, 主要功能是著重于任務的修改和查詢上。
- 不能動態(tài)的添加任務以及任務分片。
結論:功能較簡單,集群部署,文檔較少,已經(jīng)三年沒有更新,不做考慮
5.Saturn
Saturn (任務調(diào)度系統(tǒng))是唯品會開源的一個分布式任務調(diào)度平臺,取代傳統(tǒng)的Linux Cron/Spring Batch Job的方式,做到全域統(tǒng)一配置,統(tǒng)一監(jiān)控,任務高可用以及分片并發(fā)處理。
Saturn是在當當開源的Elastic Job基礎上,結合各方需求和我們的實踐見解改良而成。
重要特性
- 支持多種語言作業(yè),語言無關(Java/Go/C++/PHP/Python/Ruby/shell)
- 支持秒級調(diào)度
- 支持作業(yè)分片并行執(zhí)行
- 支持依賴作業(yè)串行執(zhí)行
- 支持作業(yè)高可用和智能負載均衡
- 支持異常檢測和自動失敗轉(zhuǎn)移
- 支持異地容災
- 支持多個集群部署
- 支持跨機房區(qū)域部署
- 支持彈性動態(tài)擴容
- 支持優(yōu)先級和權重設置
- 支持docker容器,容器化友好
- 支持cron時間表達式
- 支持多個時間段暫停執(zhí)行控制
- 支持超時告警和超時強殺控制
- 支持灰度發(fā)布
- 支持異常、超時和無法高可用作業(yè)監(jiān)控告警和簡易的故障排除
- 支持失敗率最高、最活躍和負荷最重的各域各節(jié)點TOP10的作業(yè)統(tǒng)計
- 經(jīng)受住唯品會生產(chǎn)800多個節(jié)點,每日10億級別的調(diào)度考驗
結論:該框架具有非常完善的功能點,基于elastic-job進行開發(fā),擁有quartz的強大功能,基本包含初版elastic-job的基本功能點,當前更新的活躍程度一般,有非常豐富的開發(fā)文檔以及部署文檔,可以作為參考框架之一。
6.xxl-job
XXL-JOB是一個分布式任務調(diào)度平臺,其核心設計目標是開發(fā)迅速、學習簡單、輕量級、易擴展。
特性
1.中心制
調(diào)度中心HA(中心式):調(diào)度采用中心式設計,“調(diào)度中心”自研調(diào)度組件并支持集群部署,可保證調(diào)度中心HA;
執(zhí)行器HA(分布式):任務分布式執(zhí)行,任務”執(zhí)行器”支持集群部署,可保證任務執(zhí)行HA;
2.高可用
調(diào)度中心:支持多節(jié)點部署,基于數(shù)據(jù)庫行鎖,在觸發(fā)器的名稱和執(zhí)行時間相同前提下,確保僅有一個調(diào)度中心節(jié)點會執(zhí)行任務下發(fā)工作。
執(zhí)行器:支持多節(jié)點部署,通過調(diào)度中心選擇其中的執(zhí)行器,下發(fā)任務來執(zhí)行。
3.策略路由
忙碌轉(zhuǎn)移、故障轉(zhuǎn)移、最先節(jié)點、最后節(jié)點、節(jié)點輪詢、節(jié)點隨機、一致性HASH、最少使用節(jié)點、最久未用節(jié)點、分片廣播。
4.阻塞處理
單機串行、丟棄后續(xù)調(diào)度、覆蓋之前調(diào)度。
5.故障處理
故障轉(zhuǎn)移、失敗重試、任務超時中斷。
以上是項目的一些主要特性,還包括告警、GLUE、各種語言支持、國際化、容器化等等的特性,內(nèi)容豐富,功能強大
而且相對來說簡單易用,部署簡單,配置簡單
缺點
中心化部署,數(shù)據(jù)庫行鎖,性能會存在一定的瓶頸,但是對于公司比較小的流量來說,足夠使用
7.elastic-job
ElasticJob 是面向互聯(lián)網(wǎng)生態(tài)和海量任務的分布式調(diào)度解決方案,由兩個相互獨立的子項目 ElasticJob-Lite 和 ElasticJob-Cloud 組成。 它通過彈性調(diào)度、資源管控、以及作業(yè)治理的功能,打造一個適用于互聯(lián)網(wǎng)場景的分布式調(diào)度解決方案,并通過開放的架構設計,提供多元化的作業(yè)生態(tài)。 它的各個產(chǎn)品使用統(tǒng)一的作業(yè) API,開發(fā)者僅需一次開發(fā),即可隨意部署。
特性
1.分布式調(diào)度
無作業(yè)調(diào)度中心節(jié)點,基于部署作業(yè)節(jié)點到達設定時間點時各自觸發(fā)調(diào)度;注冊中心僅用于作業(yè)注冊和監(jiān)控信息存儲,而主作業(yè)節(jié)點僅用于處理分片和清理等功能。
2.作業(yè)高可用
提供安全的方式執(zhí)行作業(yè)。將分片總數(shù)設置為1,并使用多于1臺的服務器執(zhí)行作業(yè),作業(yè)將會以1主n從的方式執(zhí)行。
一旦執(zhí)行作業(yè)的服務器崩潰,等待執(zhí)行的服務器將會在下次作業(yè)啟動時替補執(zhí)行。開啟失效轉(zhuǎn)移功能效果更好,可以保證在本次作業(yè)執(zhí)行時崩潰,備機立即啟動替補執(zhí)行。
3.資源利用率
提供最靈活的方式,最大限度的提高執(zhí)行作業(yè)的吞吐量。將分片項設置為大于服務器的數(shù)量,最好是大于服務器倍數(shù)的數(shù)量,作業(yè)將會合理的利用分布式資源,動態(tài)的分配分片項。
4.分片與業(yè)務解耦
不直接提供數(shù)據(jù)處理的功能,框架只會將分片項分配至各個運行中的作業(yè)服務器,開發(fā)者需要自行處理分片項與真實數(shù)據(jù)的對應關系。
同時可個性化參數(shù)(shardingItemParameter),分片項匹配對應關系,用于將分片項的數(shù)字轉(zhuǎn)換為更加可讀的業(yè)務代碼。
5.豐富的策略與擴展
提供了很多默認的策略機制,并且提供了SPI的擴展點,便于高級用戶進行擴展。
缺點
由于框架比較大,而且接入zookeeper,相對而言比較復雜,需要理解,而且提供的配置項比較多,需要合理使用,正確使用。
比較分析
通過以上幾個框架的描述來看,首先從社區(qū)活躍度來說,前四個已經(jīng)有多年未更新,不再考慮范圍內(nèi),然后從高可用、一致性、故障轉(zhuǎn)移、任務分片、日志追溯、異常告警等來說,后面三種框架基本支持,由于Saturn是基于elasticjob進行二次開發(fā),而且最近的更新時間在三個月,不做考慮,只在elastic-job和xxl-job之間進行考慮。
elastic-job和xxl-job
兩個從功能來說基于相同,不同的是中心化和分布式,xxl-job目前也在往分布式發(fā)展,從性能來說,達到一定的兩級來說,分布式的優(yōu)勢會更大,但是目前公司的流量來說,兩者都已經(jīng)滿足,此處沒有進行性能分析,從github上作者的回復來看,xxl-job支持5000個并發(fā),已經(jīng)足夠滿足業(yè)務需求。
從社區(qū)來說,xxl-job是個人維護的項目,雖然大眾點評已經(jīng)對其二次開發(fā)Ferrari,但是xxl-job基本屬于個人維護,而elastic-job屬于apache shardingsphere子項目,屬于apache旗下,未來肯定會有更多的人參與進開發(fā),社區(qū)活躍度優(yōu)于xxl-job
從框架技術來說,elastic-job引入了很多中間件和技術,相對于xxl-job來說,對于初級業(yè)務開發(fā)人員來說,理解上會相對難一點。
從文檔豐富程度來說,elastic-job只提供了部分比較關鍵的技術點,對于很多細節(jié)需要從源碼著手,xxl-job提供了完備的技術文檔,而且架構相對簡單,便于入手。
綜上考慮,為了后續(xù)業(yè)務發(fā)展萬一達到一定量級,xxl-job難以支持或者錯誤率過高的情況下,而且elasticjob足夠活躍的社區(qū),同時,對于初級業(yè)務開發(fā)而言,不需要完全理解,所以,目前選擇elasticjob來作為未來java定時任務框架