吳宇星
摘 要:IT系統(tǒng)都免不了存在定時(shí)任務(wù),傳統(tǒng)的(JAVA體系)系統(tǒng)建設(shè)開(kāi)發(fā)定時(shí)任務(wù)一般都是使用quartz或者spring-task,但是這兩種方案都缺乏集群能力,難以進(jìn)行水平擴(kuò)展。隨著大數(shù)據(jù)技術(shù)發(fā)展系統(tǒng)定時(shí)任務(wù)的服務(wù)很多,需要有統(tǒng)一定時(shí)任務(wù)調(diào)度服務(wù)提供定時(shí)任務(wù)的調(diào)度、管理、監(jiān)控、高可用性、可擴(kuò)展性。本文就基于Quartz構(gòu)建分布式任務(wù)調(diào)度方案進(jìn)行闡述。
關(guān)鍵詞:分布式;任務(wù);Quartz;監(jiān)控
1.引言
現(xiàn)在IT系統(tǒng)都免不了存在定時(shí)任務(wù),需要實(shí)現(xiàn)分布式任務(wù)調(diào)度平臺(tái),具備把定時(shí)任務(wù)通過(guò)集群的方式進(jìn)行管理調(diào)度,并采用分布式部署,保證系統(tǒng)的高可用,提高了容錯(cuò)。那么如何保證定時(shí)任務(wù)只在集群的某一個(gè)節(jié)點(diǎn)上執(zhí)行,或者一個(gè)任務(wù)如何拆分為多個(gè)獨(dú)立的任務(wù)項(xiàng),由分布式的機(jī)器去分別執(zhí)行。
2.功能需求
分布式任務(wù)調(diào)度平臺(tái)常用于高并發(fā),高可用的定時(shí)任務(wù)處理,如:定時(shí)發(fā)送消息,處理業(yè)務(wù)數(shù)據(jù),并需要具備特殊時(shí)候可人為干預(yù)。
總體能力目標(biāo):
√定時(shí)任務(wù)配置功能
包括任務(wù)的注冊(cè)、取消功能。配置任務(wù)對(duì)應(yīng)任務(wù)組。執(zhí)行的任務(wù)中可以根據(jù)IP和端口進(jìn)行擴(kuò)充。實(shí)現(xiàn)定時(shí)規(guī)則的配置。
√定時(shí)任務(wù)的監(jiān)控功能
監(jiān)控當(dāng)前任務(wù)組的狀態(tài),是否正在執(zhí)行,有多少個(gè)任務(wù)在執(zhí)行。
√支持定時(shí)任務(wù)的動(dòng)態(tài)擴(kuò)展
按定時(shí)任務(wù)配置的規(guī)則進(jìn)行輪詢。
√定時(shí)任務(wù)執(zhí)行
支持配置定時(shí)任務(wù)后,N秒后生效。輪循進(jìn)程開(kāi)如輪循。
具體的技術(shù)目標(biāo):
√集群管理調(diào)度,分布式部署,保證系統(tǒng)的高可用性、伸縮性、負(fù)載均衡;
√友好的操作界面,通過(guò)控制臺(tái)部署管理任務(wù),方便靈活高效;
√任務(wù)持久化于數(shù)據(jù)庫(kù),遠(yuǎn)離宕機(jī)和數(shù)據(jù)丟失隱患,完善的任務(wù)失敗重做機(jī)制,及詳細(xì)的任務(wù)跟蹤及告警策略;
√Server和Client分別支持集群和分布式部署;
√任務(wù)的執(zhí)行與調(diào)度分離;
√任務(wù)支持異步調(diào)度;
√任務(wù)狀態(tài)持久化于DB;
√完善的日志跟蹤和告警策略。
3.建設(shè)方案
3.1.總體方案
分布式任務(wù)調(diào)度平臺(tái)是基于Quartz的定時(shí)輪詢功能,進(jìn)行改造成服務(wù)端執(zhí)行端分離模式,實(shí)現(xiàn)應(yīng)用調(diào)度分布式型的結(jié)構(gòu),以及應(yīng)用跟實(shí)際調(diào)度解耦:
WEB集群實(shí)現(xiàn)界面配置功能、并支持Quartz的定時(shí)解析,保證集群內(nèi)一次只有一個(gè)服務(wù)支持定時(shí)任務(wù),對(duì)任務(wù)的解析通過(guò)Quartz解析;
任務(wù)管理器負(fù)責(zé)任務(wù)的注冊(cè)、停止、暫時(shí)以及保存狀態(tài)信息;
為保證業(yè)務(wù)與定時(shí)功能的分離。任務(wù)對(duì)應(yīng)的消息隊(duì)列在數(shù)據(jù)庫(kù)配置。為保證對(duì)原有代碼的侵入性最小,任務(wù)不需要實(shí)現(xiàn)監(jiān)聽(tīng)器。只需要在任務(wù)的service抽象類中實(shí)現(xiàn)監(jiān)聽(tīng)器進(jìn)行監(jiān)聽(tīng);
采用通用RPC服務(wù)框架進(jìn)行定時(shí)任務(wù)的通訊,支撐異步操作,響應(yīng)快。實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)充服務(wù)來(lái)滿足定時(shí)任務(wù)的處理要求,滿足高可用的要求。
分布式任務(wù)調(diào)度平臺(tái)具備如下主要特點(diǎn):
負(fù)載均衡:執(zhí)行端可集群部署,服務(wù)端會(huì)自動(dòng)實(shí)現(xiàn)負(fù)載均衡調(diào)度;
分布式:根據(jù)?;蚱渌绞降膮?shù)任務(wù)分配,實(shí)現(xiàn)同一批數(shù)據(jù)多個(gè)實(shí)例分配處理;
轉(zhuǎn)移告警:任務(wù)配置超時(shí)且策略為轉(zhuǎn)移情況下,應(yīng)用卡死的任務(wù)會(huì)進(jìn)行中斷后轉(zhuǎn)移到其他集群節(jié)點(diǎn)執(zhí)行;
軌跡記錄:根據(jù)任務(wù)運(yùn)行的各個(gè)環(huán)節(jié),以及節(jié)點(diǎn),組成一條鏈的軌跡。
3.2.功能方案
分布式任務(wù)調(diào)度平臺(tái)主要由四部分組成,管理端、客戶端、服務(wù)端、執(zhí)行端。由服務(wù)端進(jìn)行管控派發(fā)任務(wù),執(zhí)行端來(lái)執(zhí)行相應(yīng)的任務(wù),客戶端進(jìn)行提供對(duì)外的Java通信交互接口,Admin Web進(jìn)行操作任務(wù)。
3.2.1.管理端
1)任務(wù)的注冊(cè)、取消與暫停、手動(dòng)啟動(dòng),任務(wù)需要定義名稱,綁定具體的任務(wù)執(zhí)行器(JAVA類)上。
2)定時(shí)規(guī)則的配置,采用界面化配置,基于Quartz擴(kuò)展,并且支持cron表達(dá)式。
3)增加或刪除服務(wù)到任務(wù)上。具備按IP與端口增加或刪除任務(wù)到任務(wù)組上。
4)任務(wù)和任務(wù)組的監(jiān)控,具備監(jiān)控調(diào)用日志實(shí)現(xiàn)任務(wù)執(zhí)行狀態(tài)查看。
3.2.2.客戶端
1)實(shí)現(xiàn)客戶端,支持進(jìn)行任務(wù)的操作。在管理平臺(tái)的所有任務(wù)操作,全部由client端請(qǐng)求server端完成。
2)提供專門(mén)的對(duì)外接口類,只需要配置server端的地址即可new實(shí)例即可,可調(diào)用接口進(jìn)行操作查詢?nèi)蝿?wù),client跟server之間采用長(zhǎng)連接,通信損耗時(shí)間要小,可忽略不計(jì)。
3.2.3.服務(wù)端
服務(wù)端對(duì)應(yīng)用端的分布式調(diào)用,采用quartz每開(kāi)始一個(gè)子任務(wù),啟動(dòng)一個(gè)線程去執(zhí)行該子任務(wù),直到子任務(wù)執(zhí)行完畢就釋放。
3.2.4.執(zhí)行端
執(zhí)行端是任務(wù)執(zhí)行的承載體,服務(wù)端下發(fā)的業(yè)務(wù)任務(wù)實(shí)際上有執(zhí)行端進(jìn)行運(yùn)行。
1)具備任務(wù)線程池
需要自定義線程池,進(jìn)行可管控的讓優(yōu)先級(jí)高的任務(wù)進(jìn)行優(yōu)先執(zhí)行。
2)可設(shè)定任務(wù)優(yōu)先級(jí)
需要具備根據(jù)應(yīng)用配置的任務(wù)優(yōu)先級(jí),進(jìn)行調(diào)控優(yōu)先級(jí)高的任務(wù)進(jìn)行執(zhí)行,優(yōu)先級(jí)低的任務(wù)先排后面。
3)可上報(bào)執(zhí)行信息
定時(shí)上報(bào)該執(zhí)行端的線程池情況信息,包括工作中線程中對(duì)應(yīng)的任務(wù),方便線程dump分析應(yīng)用的情況。
3.3.關(guān)鍵技術(shù)方案
3.3.1.任務(wù)軌跡查看
應(yīng)用在查找任務(wù)不執(zhí)行問(wèn)題的時(shí)候,難以了解到任務(wù)的分部執(zhí)行情況軌跡,以及服務(wù)端中各種任務(wù)的狀態(tài)匯總情況,需要具備界面化的查看任務(wù)的軌跡情況、集群情況。
解決方案:
1、為了方便數(shù)據(jù)的實(shí)時(shí)性,直接采用通過(guò)客戶端從服務(wù)端實(shí)時(shí)讀取內(nèi)存中的數(shù)據(jù)。
3.3.2.任務(wù)手動(dòng)調(diào)整
實(shí)際應(yīng)用中,運(yùn)用場(chǎng)景較為復(fù)雜,有時(shí)候需要對(duì)已經(jīng)創(chuàng)建的子任務(wù)的數(shù)據(jù)進(jìn)行修改(包含任務(wù)層面修改數(shù)據(jù)以及子任務(wù)層面修改數(shù)據(jù)),則不能修改的話必須重新刪除創(chuàng)建,如果子任務(wù)數(shù)量非常多,創(chuàng)建非常麻煩。
解決方案:
quartz目前版本并不支持修改子任務(wù)的對(duì)外接口或者可操作方法,則只能由客戶端操作進(jìn)行先刪除重新新建的操作,但是要保證各個(gè)集群服務(wù)端中并無(wú)運(yùn)行中的子任務(wù)、超時(shí)子任務(wù)等一切還未執(zhí)行完畢的子任務(wù)存在。
3.3.3.任務(wù)均衡
任務(wù)分配任務(wù)算法是根據(jù)某個(gè)任務(wù)執(zhí)行子任務(wù)的時(shí)候,如果某個(gè)應(yīng)用有3個(gè)節(jié)點(diǎn)部署執(zhí)行任務(wù),創(chuàng)建了3個(gè)任務(wù),每個(gè)任務(wù)的子任務(wù)數(shù)參考圖中解釋,單次觸發(fā)多個(gè)任務(wù)的時(shí)候,會(huì)造成分配不均情況。
解決方案:
每次分配任務(wù)的時(shí)候,先查看各個(gè)節(jié)點(diǎn)已經(jīng)容納運(yùn)行的子任務(wù)數(shù)量,然后做均衡算法分配到平均,每個(gè)節(jié)點(diǎn)運(yùn)行數(shù)量相差個(gè)數(shù)不超過(guò)1。
3.3.4.異常重新執(zhí)行
quartz提供異常任務(wù)的重新觸發(fā)機(jī)制以及暫停任務(wù)的機(jī)制,由于考慮到一期輪詢中quartz每觸發(fā)一個(gè)子任務(wù)都消耗一個(gè)線程,除了異常暫停任務(wù)外,異常重新觸發(fā)由服務(wù)端外部控制觸發(fā),并不交給quartz來(lái)處理。
解決方案:
異常的任務(wù)每次落地到數(shù)據(jù)庫(kù)中,方便應(yīng)用查看歷史的異常記錄情況。
4.結(jié)束語(yǔ)
本文就基于quartz設(shè)計(jì)實(shí)現(xiàn)分布式任務(wù)調(diào)度平臺(tái)方案進(jìn)行介紹,并且目前該實(shí)現(xiàn)方案已經(jīng)在項(xiàng)目中應(yīng)用,在應(yīng)用系統(tǒng)的任務(wù)的管理、運(yùn)行上有了很大的提升,很好了支撐了業(yè)務(wù)系統(tǒng)中的后臺(tái)任務(wù)的運(yùn)行,做到可管、可控,并且具備水平擴(kuò)展能力。
參考文獻(xiàn):
[1] 分布式定時(shí)任務(wù)調(diào)度框架.https://www.jianshu.com/p/ab438d944669
(中電福富信息科技有限公司? 福建? 福州? 350013)