從 XXL-JOB 看主流分布式任務(wù)調(diào)度平臺(tái)怎樣設(shè)計(jì)調(diào)度中心和執(zhí)行器這兩個(gè)核心組件!
大家好,我是君哥。
分布式任務(wù)調(diào)度平臺(tái)執(zhí)行一次調(diào)度任務(wù),一般會(huì)經(jīng)歷下面的過(guò)程。
圖片
在上圖中,調(diào)度中心從注冊(cè)中心拉取執(zhí)行器列表,然后選擇一個(gè)執(zhí)行器來(lái)執(zhí)行任務(wù),任務(wù)執(zhí)行完成后,執(zhí)行器會(huì)把任務(wù)執(zhí)行結(jié)果通知調(diào)度中心。
主流的分布式任務(wù)調(diào)度平臺(tái),比如 XXL-JOB、PowerJob 等都設(shè)計(jì)了調(diào)度中心、執(zhí)行器這兩個(gè)核心組件。
1.調(diào)度中心
調(diào)度中心的作用不光是簡(jiǎn)單的任務(wù)觸發(fā),還包括管理執(zhí)行器列表、任務(wù)結(jié)果管理等。
1.1 任務(wù)調(diào)度方式
任務(wù)調(diào)度方式主要包括定時(shí)調(diào)度和 API 觸發(fā)調(diào)度。
定時(shí)調(diào)度有兩種方式,一種是調(diào)度中心在配置的任務(wù)執(zhí)行時(shí)間給執(zhí)行器發(fā)送任務(wù)調(diào)度信號(hào),直接把任務(wù)發(fā)起。第二種是調(diào)度中心給任務(wù)執(zhí)行器發(fā)送任務(wù)觸發(fā)時(shí)間,任務(wù)執(zhí)行器自己觸發(fā),比如使用延遲隊(duì)列。
API 觸發(fā)調(diào)度一般是調(diào)度中心收到外部 API 請(qǐng)求后,發(fā)起任務(wù)調(diào)度。
1.2 任務(wù)管理
調(diào)度中心可以創(chuàng)建、更新、刪除任務(wù)。下圖來(lái)自 XXL-JOB 官網(wǎng),XXL-JOB 在調(diào)度中心配置任務(wù)。
圖片
1.3 任務(wù)結(jié)果
調(diào)度中心監(jiān)控任務(wù)執(zhí)行結(jié)果,查看任務(wù)執(zhí)行日志,對(duì)于執(zhí)行失敗的任務(wù)也可以采取一些處置措施,比如重新觸發(fā)任務(wù)執(zhí)行。
1.4 調(diào)度時(shí)效
定時(shí)任務(wù)對(duì)執(zhí)行開(kāi)始時(shí)間有要求,這就需要調(diào)度中心能夠高效地把任務(wù)調(diào)度請(qǐng)求發(fā)出去,不能積壓調(diào)度任務(wù)。
1.5 調(diào)度策略
調(diào)度策略決定了調(diào)度中心選擇哪一個(gè)執(zhí)行器來(lái)執(zhí)行任務(wù),比如第一個(gè)、最后一個(gè)、隨機(jī)、輪詢、廣播等。
2.執(zhí)行器
執(zhí)行器是分布式任務(wù)調(diào)度系統(tǒng)中最核心的部分,它是真正執(zhí)行跑批任務(wù)、決定跑批結(jié)果的組件。
2.1 執(zhí)行器注冊(cè)
執(zhí)行器要想收到任務(wù)觸發(fā)信號(hào),必須首先在注冊(cè)中心進(jìn)行注冊(cè),被調(diào)度中心成功拉取到。
注冊(cè)成功后,需要周期性地給注冊(cè)中心發(fā)送心跳,讓調(diào)度中心感知到。
2.2 集群部署
為了保證整個(gè)調(diào)度平臺(tái)的高可用,執(zhí)行器必須集群部署,這樣如果調(diào)度中心選擇調(diào)度的節(jié)點(diǎn)出現(xiàn)故障,可以進(jìn)行重試把信號(hào)發(fā)送給下一個(gè)節(jié)點(diǎn),不用擔(dān)心任務(wù)不能被成功調(diào)度。
圖片
2.3 多線程設(shè)計(jì)
執(zhí)行器為了提高執(zhí)行效率,一般會(huì)啟動(dòng)多線程。執(zhí)行器應(yīng)該能支持線程數(shù)量靈活配置。比如一個(gè)數(shù)據(jù)量比較大的任務(wù),可以配置多線程分段處理。但為了不影響同一個(gè)執(zhí)行器上的其他任務(wù),不能把線程數(shù)配置地太高,比如可以使用一半的線程處理當(dāng)前任務(wù)。
對(duì)于更加復(fù)雜的批量任務(wù),也可以設(shè)計(jì)成多個(gè)執(zhí)行器參與來(lái)提高效率。比如一個(gè)任務(wù)調(diào)度到 4 個(gè)執(zhí)行器執(zhí)行,每個(gè)執(zhí)行器 4 個(gè)線程參與,提高執(zhí)行效率。
圖片
2.4 動(dòng)態(tài)擴(kuò)容
當(dāng)所有的執(zhí)行器都滿負(fù)荷運(yùn)行,會(huì)出現(xiàn)任務(wù)排隊(duì)的情況,如果執(zhí)行器集群可以動(dòng)態(tài)擴(kuò)容,就可以增加幾個(gè)執(zhí)行器節(jié)點(diǎn),調(diào)度中心把任務(wù)調(diào)度到新的節(jié)點(diǎn)上。
2.5 阻塞控制
單個(gè)執(zhí)行器很可能會(huì)出現(xiàn)批次任務(wù)排隊(duì)的情況,有必要采取一些阻塞控制策略。比如按照入隊(duì)順序依次執(zhí)行,或者丟棄排隊(duì)的任務(wù)直接給調(diào)度中心返回失敗。
3 總結(jié)
調(diào)度中心和執(zhí)行器是分布式任務(wù)調(diào)度平臺(tái)的兩個(gè)核心組件,調(diào)度中心負(fù)責(zé)任務(wù)觸發(fā)和調(diào)度,執(zhí)行器負(fù)責(zé)任務(wù)執(zhí)行和結(jié)果反饋。理解了這 2 個(gè)核心概念,就可以很容易地理解主流分布式調(diào)度平臺(tái)的設(shè)計(jì)原理了。