一般情況下我們開發(fā)一個(gè)定時(shí)任務(wù)的時(shí)候,就從隔壁的定時(shí)任務(wù)copy一下,加一些必要的注解,然后再到調(diào)度中心配置一下,也沒怎么去關(guān)注其他的功能。
最近無聊看了一遍xxl-job的文檔,發(fā)現(xiàn)一些自己沒怎么去關(guān)注過的特性,可能以后工作中可以用起來,先記錄一下。
一、分片廣播
int shardIndex = XxlJobHelper.getShardIndex(); //分片序號(hào)
int shardTotal = XxlJobHelper.getShardTotal(); //總分片數(shù)
這兩個(gè)值是我們可以直接獲取到的,只要依賴了xxl-job的包
分片:我們可以理解成總的任務(wù)節(jié)點(diǎn)數(shù),一般微服務(wù)我們都是部署在集群里邊的,一個(gè)服務(wù)可能有好幾個(gè)節(jié)點(diǎn),那么分片總數(shù)就是總節(jié)點(diǎn)數(shù),分片序號(hào)也可以理解成執(zhí)行定時(shí)任務(wù)的節(jié)點(diǎn)序號(hào)
有了這兩個(gè)值,我們可以將我們的任務(wù)分解成多個(gè),分布式去執(zhí)行,這樣效率就會(huì)快很多。
比如說,我們的定時(shí)任務(wù)需要對(duì)數(shù)據(jù)庫里的數(shù)據(jù)做處理,服務(wù)節(jié)點(diǎn)有3個(gè),那么我們可以把數(shù)據(jù)分成三份去處理,比如 數(shù)據(jù)id/shardTotal == shardIndex ,判斷是否由當(dāng)前節(jié)點(diǎn)去處理,如何分解任務(wù)到多個(gè)節(jié)點(diǎn)去執(zhí)行我們可以自己根據(jù)具體的業(yè)務(wù)去決定。
另外也可以執(zhí)行廣播任務(wù),一般情況下我們都是希望任務(wù)在一個(gè)節(jié)點(diǎn)執(zhí)行就行,但我們選擇分片廣播,如果我們不對(duì)任務(wù)進(jìn)行分解,那么每個(gè)節(jié)點(diǎn)丟會(huì)執(zhí)行一樣的任務(wù),適用的場(chǎng)景比如廣播集群節(jié)點(diǎn)進(jìn)行緩存更新等
注:這時(shí)候的路由策略我們需要選擇“SHARDING_BROADCAST(分片廣播)”
二、父子任務(wù)
有時(shí)候我們的定時(shí)任務(wù)執(zhí)行是有先后順序的,某個(gè)定時(shí)任務(wù)依賴另一個(gè)定時(shí)任務(wù),我們可能會(huì)選擇把需要后執(zhí)行的任務(wù)執(zhí)行時(shí)間設(shè)置到晚于依賴的定時(shí)任務(wù),比如晚5分鐘,半小時(shí)執(zhí)行這樣子,但這樣如果前一個(gè)任務(wù)突然故障或者說執(zhí)行了很久,導(dǎo)致還沒執(zhí)行完依賴的任務(wù)就開始執(zhí)行了,就會(huì)造成一些數(shù)據(jù)混亂或者說異常。
因此我們?cè)谂渲萌蝿?wù)的時(shí)候可以配置子任務(wù)的id,當(dāng)父任務(wù)執(zhí)行結(jié)束且執(zhí)行成功后將會(huì)主動(dòng)觸發(fā)一次子任務(wù)的執(zhí)行, 多個(gè)子任務(wù)用逗號(hào)分隔;
三、GLUE模式
大部分情況我們都是選擇Bean模式,將定時(shí)任務(wù)作為一個(gè)類寫在服務(wù)里面,服務(wù)啟動(dòng)的時(shí)候再自動(dòng)注冊(cè)到調(diào)度中心。但是GLUE模式源碼是維護(hù)在調(diào)度中心的,我們可以直接在頁面編輯源碼,而且支持多種語言,比如java、shell、python等,還有版本回溯功能,這樣當(dāng)我們要開發(fā)一些和業(yè)務(wù)關(guān)系不大的定時(shí)任務(wù)的時(shí)候可以直接在平臺(tái)上開發(fā),在平臺(tái)上維護(hù)。
