定時(shí)任務(wù)框架選型

定時(shí)任務(wù)框架選型

quartz

light-task-scheduler

elastic-job

xxl-job

Saturn

opencron

antares

1.quartz

quartz 的常見集群方案如下,通過(guò)在數(shù)據(jù)庫(kù)中配置定時(shí)器信息, 以數(shù)據(jù)庫(kù)悲觀鎖的方式達(dá)到同一個(gè)任務(wù)始終只有一個(gè)節(jié)點(diǎn)在運(yùn)行

優(yōu)點(diǎn)

· 保證節(jié)點(diǎn)高可用 (HA), 如果某一個(gè)幾點(diǎn)掛了, 其他節(jié)e 點(diǎn)可以頂上

缺點(diǎn)

- 同一個(gè)任務(wù)只能有一個(gè)節(jié)點(diǎn)運(yùn)行,其他節(jié)點(diǎn)將不執(zhí)行任務(wù),性能低,資源浪費(fèi)

- 當(dāng)碰到大量短任務(wù)時(shí),各個(gè)節(jié)點(diǎn)頻繁的競(jìng)爭(zhēng)數(shù)據(jù)庫(kù)鎖,節(jié)點(diǎn)越多這種情況越嚴(yán)重。性能會(huì)很低下

- quartz 的分布式僅解決了集群高可用的問(wèn)題,并沒(méi)有解決任務(wù)分片的問(wèn)題,不能實(shí)現(xiàn)水平擴(kuò)展

結(jié)論:quartz作為開源作業(yè)調(diào)度中的佼佼者,是作業(yè)調(diào)度的首選,但是因?yàn)榇嬖谝恍﹩?wèn)題,其他的定時(shí)任務(wù)框架有好多是基于quartz做的拓展式的開發(fā),能夠體現(xiàn)quartz作為作業(yè)調(diào)度的作用,同事也彌補(bǔ)了其缺陷,所以,暫時(shí)不考慮

2.light-task-scheduler

框架概況

LTS(light-task-scheduler)主要用于解決分布式任務(wù)調(diào)度問(wèn)題,支持實(shí)時(shí)任務(wù),定時(shí)任務(wù)和Cron任務(wù)。有較好的伸縮性,擴(kuò)展性,健壯穩(wěn)定性而被多家公司使用。

LTS 有主要有以下四種節(jié)點(diǎn):

- JobClient:主要負(fù)責(zé)提交任務(wù), 并接收任務(wù)執(zhí)行反饋結(jié)果。

- JobTracker:負(fù)責(zé)接收并分配任務(wù),任務(wù)調(diào)度。

- TaskTracker:負(fù)責(zé)執(zhí)行任務(wù),執(zhí)行完反饋給JobTracker。

- LTS-Admin:(管理后臺(tái))主要負(fù)責(zé)節(jié)點(diǎn)管理,任務(wù)隊(duì)列管理,監(jiān)控管理等。

其中JobClient,JobTracker,TaskTracker節(jié)點(diǎn)都是無(wú)狀態(tài)的。 可以部署多個(gè)并動(dòng)態(tài)的進(jìn)行刪減,來(lái)實(shí)現(xiàn)負(fù)載均衡,實(shí)現(xiàn)更大的負(fù)載量, 并且框架采用FailStore策略使LTS具有很好的容錯(cuò)能力。

LTS注冊(cè)中心提供多種實(shí)現(xiàn)(Zookeeper,redis等),注冊(cè)中心進(jìn)行節(jié)點(diǎn)信息暴露,master選舉。(Mongo or Mysql)存儲(chǔ)任務(wù)隊(duì)列和任務(wù)執(zhí)行日志, netty or mina做底層通信, 并提供多種序列化方式fastjson, hessian2, java等。

LTS支持任務(wù)類型:

- 實(shí)時(shí)任務(wù):提交了之后立即就要執(zhí)行的任務(wù)。

- 定時(shí)任務(wù):在指定時(shí)間點(diǎn)執(zhí)行的任務(wù),譬如 今天3點(diǎn)執(zhí)行(單次)。

- Cron任務(wù):CronExpression,和quartz類似(但是不是使用quartz實(shí)現(xiàn)的)譬如 0 0/1 * * * ?

支持動(dòng)態(tài)修改任務(wù)參數(shù),任務(wù)執(zhí)行時(shí)間等設(shè)置,支持后臺(tái)動(dòng)態(tài)添加任務(wù),支持Cron任務(wù)暫停,支持手動(dòng)停止正在執(zhí)行的任務(wù)(有條件),支持任務(wù)的監(jiān)控統(tǒng)計(jì),支持各個(gè)節(jié)點(diǎn)的任務(wù)執(zhí)行監(jiān)控,JVM監(jiān)控等等.

架構(gòu)圖


流程圖

結(jié)論:集群部署,支持分片,git上有較完善的文檔,有可視化界面,由阿里提供,具有比較完善的拓展方式,功能也較完善,但是已經(jīng)三年沒(méi)有維護(hù),原則上要選擇社區(qū)活躍的架構(gòu),所以不考慮

3.antares

?Antares特性

基于Quartz的分布式調(diào)度

- 一個(gè)任務(wù)僅會(huì)被服務(wù)器集群中的某個(gè)節(jié)點(diǎn)調(diào)度,調(diào)度機(jī)制基于成熟的Quartz,antares內(nèi)部會(huì)重寫執(zhí)行邏輯;

并行執(zhí)行

- 用戶可通過(guò)對(duì)任務(wù)預(yù)分片,有效提升任務(wù)執(zhí)行效率;

失效轉(zhuǎn)移

- 客戶端實(shí)效轉(zhuǎn)移:當(dāng)某個(gè)客戶端實(shí)例在執(zhí)行任務(wù)中宕機(jī)時(shí),其正在執(zhí)行的分片將重新由其他客戶端實(shí)例執(zhí)行;

- 服務(wù)器失效轉(zhuǎn)移:當(dāng)服務(wù)器集群中某個(gè)節(jié)點(diǎn)宕機(jī)時(shí),其正在調(diào)度的任務(wù)將轉(zhuǎn)移到其他節(jié)點(diǎn)去調(diào)度;

彈性擴(kuò)容

- 客戶端擴(kuò)容:客戶端可通過(guò)增加應(yīng)用實(shí)例,提升任務(wù)執(zhí)行的效率;

- 服務(wù)器擴(kuò)容:服務(wù)器集群可通過(guò)增加節(jié)點(diǎn),提升集群任務(wù)調(diào)度的服務(wù)能力;

進(jìn)程級(jí)的應(yīng)用實(shí)例

- antares通過(guò)ip+進(jìn)程號(hào)標(biāo)識(shí)客戶端應(yīng)用實(shí)例,因此支持單機(jī)多應(yīng)用實(shí)例部署;

任務(wù)依賴

- antares支持樹形任務(wù)依賴,當(dāng)某任務(wù)執(zhí)行完成后,會(huì)通知其后置任務(wù)執(zhí)行;

任務(wù)報(bào)警

- antares支持基本的任務(wù)超時(shí)報(bào)警,失敗報(bào)警等;

管理控制臺(tái)

- 用戶可通過(guò)控制臺(tái)antares-tower對(duì)任務(wù)進(jìn)行基本操作,如觸發(fā),暫停,監(jiān)控等。

Antares架構(gòu)

結(jié)論:集群部署,以zk為注冊(cè)中心,支持分片,git上有較完善的文檔,有可視化見面,可彈性擴(kuò)容,用redis來(lái)做持久化,基本功能也完備,但是已經(jīng)三年沒(méi)有維護(hù),原則上要選擇社區(qū)活躍的架構(gòu),所以不考慮

4.opencron

一個(gè)功能完善真正通用的linux定時(shí)任務(wù)調(diào)度定系統(tǒng),滿足多種場(chǎng)景下各種復(fù)雜的定時(shí)任務(wù)調(diào)度,同時(shí)集成了linux實(shí)時(shí)監(jiān)控,webssh,提供一個(gè)方便管理定時(shí)任務(wù)的平臺(tái).

缺點(diǎn)

- 僅支持 kill任務(wù), 現(xiàn)場(chǎng)執(zhí)行,查詢?nèi)蝿?wù)運(yùn)行狀態(tài) 等, 主要功能是著重于任務(wù)的修改和查詢上。

- 不能動(dòng)態(tài)的添加任務(wù)以及任務(wù)分片。

結(jié)論:功能較簡(jiǎn)單,集群部署,文檔較少,已經(jīng)三年沒(méi)有更新,不做考慮

5.Saturn

Saturn (任務(wù)調(diào)度系統(tǒng))是唯品會(huì)開源的一個(gè)分布式任務(wù)調(diào)度平臺(tái),取代傳統(tǒng)的Linux Cron/Spring Batch Job的方式,做到全域統(tǒng)一配置,統(tǒng)一監(jiān)控,任務(wù)高可用以及分片并發(fā)處理。

Saturn是在當(dāng)當(dāng)開源的Elastic Job基礎(chǔ)上,結(jié)合各方需求和我們的實(shí)踐見解改良而成。

重要特性

- 支持多種語(yǔ)言作業(yè),語(yǔ)言無(wú)關(guān)(Java/Go/C++/PHP/Python/Ruby/shell)

- 支持秒級(jí)調(diào)度

- 支持作業(yè)分片并行執(zhí)行

- 支持依賴作業(yè)串行執(zhí)行

- 支持作業(yè)高可用和智能負(fù)載均衡

- 支持異常檢測(cè)和自動(dòng)失敗轉(zhuǎn)移

- 支持異地容災(zāi)

- 支持多個(gè)集群部署

- 支持跨機(jī)房區(qū)域部署

- 支持彈性動(dòng)態(tài)擴(kuò)容

- 支持優(yōu)先級(jí)和權(quán)重設(shè)置

- 支持docker容器,容器化友好

- 支持cron時(shí)間表達(dá)式

- 支持多個(gè)時(shí)間段暫停執(zhí)行控制

- 支持超時(shí)告警和超時(shí)強(qiáng)殺控制

- 支持灰度發(fā)布

- 支持異常、超時(shí)和無(wú)法高可用作業(yè)監(jiān)控告警和簡(jiǎn)易的故障排除

- 支持失敗率最高、最活躍和負(fù)荷最重的各域各節(jié)點(diǎn)TOP10的作業(yè)統(tǒng)計(jì)

- 經(jīng)受住唯品會(huì)生產(chǎn)800多個(gè)節(jié)點(diǎn),每日10億級(jí)別的調(diào)度考驗(yàn)

結(jié)論:該框架具有非常完善的功能點(diǎn),基于elastic-job進(jìn)行開發(fā),擁有quartz的強(qiáng)大功能,基本包含初版elastic-job的基本功能點(diǎn),當(dāng)前更新的活躍程度一般,有非常豐富的開發(fā)文檔以及部署文檔,可以作為參考框架之一。

6.xxl-job

XXL-JOB是一個(gè)分布式任務(wù)調(diào)度平臺(tái),其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡(jiǎn)單、輕量級(jí)、易擴(kuò)展。

特性

1.中心制

調(diào)度中心HA(中心式):調(diào)度采用中心式設(shè)計(jì),“調(diào)度中心”自研調(diào)度組件并支持集群部署,可保證調(diào)度中心HA;

執(zhí)行器HA(分布式):任務(wù)分布式執(zhí)行,任務(wù)”執(zhí)行器”支持集群部署,可保證任務(wù)執(zhí)行HA;

2.高可用

調(diào)度中心:支持多節(jié)點(diǎn)部署,基于數(shù)據(jù)庫(kù)行鎖,在觸發(fā)器的名稱和執(zhí)行時(shí)間相同前提下,確保僅有一個(gè)調(diào)度中心節(jié)點(diǎn)會(huì)執(zhí)行任務(wù)下發(fā)工作。

執(zhí)行器:支持多節(jié)點(diǎn)部署,通過(guò)調(diào)度中心選擇其中的執(zhí)行器,下發(fā)任務(wù)來(lái)執(zhí)行。

3.策略路由

忙碌轉(zhuǎn)移、故障轉(zhuǎn)移、最先節(jié)點(diǎn)、最后節(jié)點(diǎn)、節(jié)點(diǎn)輪詢、節(jié)點(diǎn)隨機(jī)、一致性HASH、最少使用節(jié)點(diǎn)、最久未用節(jié)點(diǎn)、分片廣播。

4.阻塞處理

單機(jī)串行、丟棄后續(xù)調(diào)度、覆蓋之前調(diào)度。

5.故障處理

故障轉(zhuǎn)移、失敗重試、任務(wù)超時(shí)中斷。

以上是項(xiàng)目的一些主要特性,還包括告警、GLUE、各種語(yǔ)言支持、國(guó)際化、容器化等等的特性,內(nèi)容豐富,功能強(qiáng)大

而且相對(duì)來(lái)說(shuō)簡(jiǎn)單易用,部署簡(jiǎn)單,配置簡(jiǎn)單

缺點(diǎn)

中心化部署,數(shù)據(jù)庫(kù)行鎖,性能會(huì)存在一定的瓶頸,但是對(duì)于公司比較小的流量來(lái)說(shuō),足夠使用

7.elastic-job

ElasticJob 是面向互聯(lián)網(wǎng)生態(tài)和海量任務(wù)的分布式調(diào)度解決方案,由兩個(gè)相互獨(dú)立的子項(xiàng)目 ElasticJob-Lite 和 ElasticJob-Cloud 組成。 它通過(guò)彈性調(diào)度、資源管控、以及作業(yè)治理的功能,打造一個(gè)適用于互聯(lián)網(wǎng)場(chǎng)景的分布式調(diào)度解決方案,并通過(guò)開放的架構(gòu)設(shè)計(jì),提供多元化的作業(yè)生態(tài)。 它的各個(gè)產(chǎn)品使用統(tǒng)一的作業(yè) API,開發(fā)者僅需一次開發(fā),即可隨意部署。

特性

1.分布式調(diào)度

無(wú)作業(yè)調(diào)度中心節(jié)點(diǎn),基于部署作業(yè)節(jié)點(diǎn)到達(dá)設(shè)定時(shí)間點(diǎn)時(shí)各自觸發(fā)調(diào)度;注冊(cè)中心僅用于作業(yè)注冊(cè)和監(jiān)控信息存儲(chǔ),而主作業(yè)節(jié)點(diǎn)僅用于處理分片和清理等功能。

2.作業(yè)高可用

提供安全的方式執(zhí)行作業(yè)。將分片總數(shù)設(shè)置為1,并使用多于1臺(tái)的服務(wù)器執(zhí)行作業(yè),作業(yè)將會(huì)以1主n從的方式執(zhí)行。

一旦執(zhí)行作業(yè)的服務(wù)器崩潰,等待執(zhí)行的服務(wù)器將會(huì)在下次作業(yè)啟動(dòng)時(shí)替補(bǔ)執(zhí)行。開啟失效轉(zhuǎn)移功能效果更好,可以保證在本次作業(yè)執(zhí)行時(shí)崩潰,備機(jī)立即啟動(dòng)替補(bǔ)執(zhí)行。

3.資源利用率

提供最靈活的方式,最大限度的提高執(zhí)行作業(yè)的吞吐量。將分片項(xiàng)設(shè)置為大于服務(wù)器的數(shù)量,最好是大于服務(wù)器倍數(shù)的數(shù)量,作業(yè)將會(huì)合理的利用分布式資源,動(dòng)態(tài)的分配分片項(xiàng)。

4.分片與業(yè)務(wù)解耦

不直接提供數(shù)據(jù)處理的功能,框架只會(huì)將分片項(xiàng)分配至各個(gè)運(yùn)行中的作業(yè)服務(wù)器,開發(fā)者需要自行處理分片項(xiàng)與真實(shí)數(shù)據(jù)的對(duì)應(yīng)關(guān)系。

同時(shí)可個(gè)性化參數(shù)(shardingItemParameter),分片項(xiàng)匹配對(duì)應(yīng)關(guān)系,用于將分片項(xiàng)的數(shù)字轉(zhuǎn)換為更加可讀的業(yè)務(wù)代碼。

5.豐富的策略與擴(kuò)展

提供了很多默認(rèn)的策略機(jī)制,并且提供了SPI的擴(kuò)展點(diǎn),便于高級(jí)用戶進(jìn)行擴(kuò)展。

缺點(diǎn)

由于框架比較大,而且接入zookeeper,相對(duì)而言比較復(fù)雜,需要理解,而且提供的配置項(xiàng)比較多,需要合理使用,正確使用。

比較分析

通過(guò)以上幾個(gè)框架的描述來(lái)看,首先從社區(qū)活躍度來(lái)說(shuō),前四個(gè)已經(jīng)有多年未更新,不再考慮范圍內(nèi),然后從高可用、一致性、故障轉(zhuǎn)移、任務(wù)分片、日志追溯、異常告警等來(lái)說(shuō),后面三種框架基本支持,由于Saturn是基于elasticjob進(jìn)行二次開發(fā),而且最近的更新時(shí)間在三個(gè)月,不做考慮,只在elastic-job和xxl-job之間進(jìn)行考慮。

elastic-job和xxl-job

兩個(gè)從功能來(lái)說(shuō)基于相同,不同的是中心化和分布式,xxl-job目前也在往分布式發(fā)展,從性能來(lái)說(shuō),達(dá)到一定的兩級(jí)來(lái)說(shuō),分布式的優(yōu)勢(shì)會(huì)更大,但是目前公司的流量來(lái)說(shuō),兩者都已經(jīng)滿足,此處沒(méi)有進(jìn)行性能分析,從github上作者的回復(fù)來(lái)看,xxl-job支持5000個(gè)并發(fā),已經(jīng)足夠滿足業(yè)務(wù)需求。

從社區(qū)來(lái)說(shuō),xxl-job是個(gè)人維護(hù)的項(xiàng)目,雖然大眾點(diǎn)評(píng)已經(jīng)對(duì)其二次開發(fā)Ferrari,但是xxl-job基本屬于個(gè)人維護(hù),而elastic-job屬于apache shardingsphere子項(xiàng)目,屬于apache旗下,未來(lái)肯定會(huì)有更多的人參與進(jìn)開發(fā),社區(qū)活躍度優(yōu)于xxl-job

從框架技術(shù)來(lái)說(shuō),elastic-job引入了很多中間件和技術(shù),相對(duì)于xxl-job來(lái)說(shuō),對(duì)于初級(jí)業(yè)務(wù)開發(fā)人員來(lái)說(shuō),理解上會(huì)相對(duì)難一點(diǎn)。

從文檔豐富程度來(lái)說(shuō),elastic-job只提供了部分比較關(guān)鍵的技術(shù)點(diǎn),對(duì)于很多細(xì)節(jié)需要從源碼著手,xxl-job提供了完備的技術(shù)文檔,而且架構(gòu)相對(duì)簡(jiǎn)單,便于入手。

綜上考慮,為了后續(xù)業(yè)務(wù)發(fā)展萬(wàn)一達(dá)到一定量級(jí),xxl-job難以支持或者錯(cuò)誤率過(guò)高的情況下,而且elasticjob足夠活躍的社區(qū),同時(shí),對(duì)于初級(jí)業(yè)務(wù)開發(fā)而言,不需要完全理解,所以,目前選擇elasticjob來(lái)作為未來(lái)java定時(shí)任務(wù)框架

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容