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