一桐愉、.為什么要使用elasticjob
1. 可動(dòng)態(tài)修改任務(wù)執(zhí)行時(shí)間, 解決quartz 修改配置需重啟系統(tǒng)問題. 可運(yùn)維.
2: 可通過調(diào)整分片的方式, 動(dòng)態(tài)調(diào)整任務(wù)執(zhí)行線程的數(shù)量. 動(dòng)態(tài)改變?nèi)蝿?wù)吞吐量.
3: Lite-Job 一臺(tái)機(jī)器能起一個(gè)實(shí)例, 多臺(tái)機(jī)器分別起實(shí)例同時(shí)執(zhí)行, 解決quartz 單機(jī)執(zhí)行問題, 可擴(kuò)展.
二瘫辩、elasticjob原理
底層執(zhí)行仍然采用quartz,執(zhí)行過程中會(huì)對數(shù)據(jù)進(jìn)行取膜。取膜結(jié)果與當(dāng)前服務(wù)器擁有的分片做比較,相等則執(zhí)行,否則不予執(zhí)行侮穿。
單機(jī)多分片情形:job觸發(fā)時(shí)會(huì)new多個(gè)線程執(zhí)行(每個(gè)線程的分片數(shù)不同)
多機(jī)多分片情形:job觸發(fā)時(shí)會(huì)先去zookeeper節(jié)點(diǎn)下的leader節(jié)點(diǎn)檢測看是否有sharding目錄下的necssary節(jié)點(diǎn),有則會(huì)重新執(zhí)行分片毁嗦。分片策略參考如下亲茅。
三、分片策略
1.AverageAllocationJobShardingStrategy
基于平均分配算法的分片策略狗准,也是默認(rèn)的分片策略克锣。
如果分片不能整除,則不能整除的多余分片將依次追加到序號小的服務(wù)器腔长。如:
如果有3臺(tái)服務(wù)器袭祟,分成9片,則每臺(tái)服務(wù)器分到的分片是:1=[0,1,2], 2=[3,4,5], 3=[6,7,8]
如果有3臺(tái)服務(wù)器捞附,分成8片巾乳,則每臺(tái)服務(wù)器分到的分片是:1=[0,1,6], 2=[2,3,7], 3=[4,5]
如果有3臺(tái)服務(wù)器,分成10片鸟召,則每臺(tái)服務(wù)器分到的分片是:1=[0,1,2,9], 2=[3,4,5], 3=[6,7,8]
2.OdevitySortByNameJobShardingStrategy
根據(jù)作業(yè)名的哈希值奇偶數(shù)決定IP升降序算法的分片策略胆绊。
作業(yè)名的哈希值為奇數(shù)則IP升序,作業(yè)名的哈希值為偶數(shù)則IP降序欧募。
用于不同的作業(yè)平均分配負(fù)載至不同的服務(wù)器压状。
AverageAllocationJobShardingStrategy的缺點(diǎn)是,一旦分片數(shù)小于作業(yè)服務(wù)器數(shù)槽片,作業(yè)將永遠(yuǎn)分配至IP地址靠前的服務(wù)器,導(dǎo)致IP地址靠后的服務(wù)器空閑肢础。而OdevitySortByNameJobShardingStrategy則可以根據(jù)作業(yè)名稱重新分配服務(wù)器負(fù)載还栓。如:
如果有3臺(tái)服務(wù)器,分成2片传轰,作業(yè)名稱的哈希值為奇數(shù)剩盒,則每臺(tái)服務(wù)器分到的分片是:1=[0], 2=[1], 3=[]
如果有3臺(tái)服務(wù)器,分成2片慨蛙,作業(yè)名稱的哈希值為偶數(shù)辽聊,則每臺(tái)服務(wù)器分到的分片是:3=[0], 2=[1], 1=[]
3.RotateServerByNameJobShardingStrategy
根據(jù)作業(yè)名的哈希值對服務(wù)器列表進(jìn)行輪轉(zhuǎn)的分片策略纪挎。
四、處理方式
1跟匆、SimpleJob類型處理方式
意為簡單實(shí)現(xiàn)异袄,未經(jīng)任何封裝的類型。需實(shí)現(xiàn)SimpleJob接口玛臂。該接口僅提供單一方法用于覆蓋烤蜕,此方法將定時(shí)執(zhí)行。與Quartz原生接口相似迹冤,但提供了彈性擴(kuò)縮容和分片等功能讽营。
2、DataflowJob類型作業(yè)
流式處理類型作業(yè)
即使實(shí)現(xiàn)了DataflowJob接口 默認(rèn)也是不開啟流式作業(yè)泡徙。
何為流式橱鹏? ?就是fetchData后List,調(diào)用processData時(shí)候堪藐,傳整個(gè)list莉兰。執(zhí)行后再去fetch,如果還有符合條件的繼續(xù)processData庶橱。
非流式只有時(shí)間片到了才觸發(fā)執(zhí)行贮勃。
此外,還有一點(diǎn)苏章, fetch的List, 會(huì)遍歷list寂嘉,每條記錄作為task扔到線程中,processData(List),每次處理的都是一條數(shù)據(jù)枫绅。