Oozie 使用 CallableQueueService 來異步執(zhí)行操作吻育;
特點:
Callables can be queued for immediate execution or for delayed execution (some time in the future).
加入執(zhí)行隊列的任務(wù)可能是可以立即被吊起的,也可能是未來某個時間才觸發(fā)的。
Callables are consumed from the queue for execution based on their priority.
執(zhí)行線程池根據(jù) 任務(wù)的執(zhí)行時間和任務(wù)的優(yōu)先級別來選取任務(wù)吊起包个。
When the queues (for immediate execution and for delayed execution) are full, the callable queue service stops queuing callables.
執(zhí)行線程池的任務(wù)隊列大小可配置矢沿,當?shù)竭_隊列最大值,線程池將不再接收任務(wù)何什。
參數(shù)說明:
int maxCallableConcurrency:并發(fā)數(shù)控制
Map<String, AtomicInteger> activeCallables:每種類型的任務(wù)的實時并發(fā)數(shù);
Map<String, Date> uniqueCallables:標識在隊列中的任務(wù)等龙,并且還沒有開始執(zhí)行完成的处渣,任務(wù)加入隊列前,需要和改map的任務(wù)做重復檢查蛛砰,用來防止任務(wù)的重復提交罐栈,執(zhí)行。
int interruptMapMaxSize:
ConcurrentHashMap<String, Set<XCallable<?>>> interruptCommandsMap:
int queueSize:任務(wù)隊列大小
ThreadPoolExecutor executor:任務(wù)執(zhí)行器
線程池選取的隊列是oozie自定義的隊列 PriorityDelayQueue:
特點:
根據(jù)隊列中元素的延時時間以及其執(zhí)行優(yōu)先級出隊列:
實現(xiàn)策略:
PriorityDelayQueue 中為每個優(yōu)先級別的任務(wù)設(shè)置一個 延時隊列 DelayQueue
因為使用的是jdk自帶的延時隊列 DelayQueue泥畅,可以保證的是如果任務(wù)在該隊列中的延時時間滿足條件荠诬,我們
通過poll()方法即可得到滿足延時條件的任務(wù),如果 poll()得到的是null位仁,說明該隊列的中任務(wù)沒有滿足時間條件的任務(wù)浅妆。
如何編排多個優(yōu)先級的隊列:
每次從PriorityDelayQueue去選取任務(wù),都優(yōu)先從最高優(yōu)先級的隊列來poll出任務(wù)障癌,如果最高的優(yōu)先級隊列中沒有滿足條件的任務(wù)凌外,則次優(yōu)先級隊列poll出任務(wù),如果仍未獲取
將按照隊列優(yōu)先等級以此類推涛浙。
餓死現(xiàn)象:假如高優(yōu)先級中的任務(wù)在每次獲取的時候都滿足條件康辑,這樣容易將低優(yōu)先級的隊列中滿足條件的任務(wù)活活餓死,為了防止這種情況的產(chǎn)生轿亮,在每次選取任務(wù)之前疮薇,遍歷
低優(yōu)先級隊列任務(wù),如果任務(wù)早已經(jīng)滿足出隊列條件我注,如果超時時間超過了我們設(shè)定的最大值按咒,我們會為這個任務(wù)提高優(yōu)先級,將這個任務(wù)優(yōu)先級加一但骨,添加到上個優(yōu)先級隊列中進行
排隊励七。
優(yōu)化隊列 PollablePriorityDelayQueue:
特點:
在從隊列中選取任務(wù)的時候智袭,先判斷滿足時間的任務(wù)是否滿足并發(fā)等限制,如果滿足再從隊列中取出掠抬,而不是像PriorityDelayQueue那樣吼野,先取出如果不滿足并發(fā)等限制,再將該任務(wù)重新放置回去两波。
任務(wù)類型:
使用線程池異步執(zhí)行任務(wù)瞳步,任務(wù)和任務(wù)之間是無序的,針對具體的業(yè)務(wù)場景腰奋,可能執(zhí)行的單元是需要串序執(zhí)行的单起。oozie中封裝了 CompositeCallable 和 一般的 XCallable的任務(wù)
類型,前者是XCallable的一個集合劣坊,它能保證的是這個集合里面的XCallable是順序執(zhí)行的嘀倒。