王者歸來:分布式調(diào)度解決方案 ElasticJob 重啟!
點(diǎn)擊上方藍(lán)色“程序猿DD”,選擇“設(shè)為星標(biāo)”
回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!

你會(huì)誤認(rèn)為 ElasticJob 只是作業(yè)管控平臺(tái)么?創(chuàng)始人為你解讀產(chǎn)品定位與新版本設(shè)計(jì)理念。
——寫于 ElasticJob 3.x 版本發(fā)布前夕
背景
ElasticJob 是什么?
ElasticJob 調(diào)度模型
ElasticJob 功能列表
ElasticJob 典型應(yīng)用場(chǎng)景
ElasticJob 新版本設(shè)計(jì)理念
未來規(guī)劃
關(guān)于 ElasticJob 社區(qū)
背景導(dǎo)讀:?調(diào)度(Scheduling)在計(jì)算機(jī)領(lǐng)域是個(gè)龐大概念,CPU 調(diào)度、內(nèi)存調(diào)度、進(jìn)程調(diào)度等都可稱之為調(diào)度。它是指在特定的時(shí)機(jī)分配合理的資源去處理預(yù)先確定的任務(wù),用于在適當(dāng)?shù)臅r(shí)機(jī)觸發(fā)一個(gè)包含業(yè)務(wù)邏輯的應(yīng)用。調(diào)度無論在單機(jī)還是分布式環(huán)境中都是很重要的課題。在單機(jī)環(huán)境,調(diào)度與底層操作系統(tǒng)脫離不了干系;而在分布式環(huán)境中,調(diào)度直接決定運(yùn)行集群的投入和產(chǎn)出。調(diào)度的兩個(gè)核心要素是資源治理和觸發(fā)時(shí)機(jī)。
ElasticJob 誕生于 2015 年,當(dāng)時(shí)業(yè)界雖然有 QuartZ 等出類拔萃的定時(shí)任務(wù)框架,但缺乏分布式方面的探索。分布式調(diào)度云平臺(tái)產(chǎn)品的缺失,使得 ElasticJob 從出現(xiàn)伊始便備受關(guān)注。它有效的彌補(bǔ)了作業(yè)在分布式領(lǐng)域的短板,并且提供了一站式的自動(dòng)化運(yùn)維管控端。
ElasticJob 在技術(shù)選型時(shí),選擇站在了巨人的肩膀上而不是重復(fù)制造輪子的理念,將定時(shí)任務(wù)事實(shí)標(biāo)準(zhǔn)的 QuartZ 與 分布式協(xié)調(diào)的利器 ZooKeeper 完美結(jié)合,快速而穩(wěn)定的搭建了全新概念的分布式調(diào)度框架。
ElasticJob 是什么?ElasticJob 是一個(gè)分布式調(diào)度解決方案,由兩個(gè)相互獨(dú)立的子項(xiàng)目 ElasticJob Lite 和 ElasticJob Cloud 組成。ElasticJob Lite 定位為輕量級(jí)無中心化解決方案,使用 jar 的形式提供分布式任務(wù)的協(xié)調(diào)服務(wù);ElasticJob Cloud 采用自研 Mesos Framework 的解決方案,額外提供資源治理、應(yīng)用分發(fā)以及進(jìn)程隔離等功能。它通過彈性調(diào)度、資源管控、以及作業(yè)治理的功能,打造一個(gè)適用于互聯(lián)網(wǎng)場(chǎng)景的分布式調(diào)度解決方案,并通過開放的架構(gòu)設(shè)計(jì),提供多元化的作業(yè)生態(tài)。
使用 ElasticJob 能夠讓開發(fā)工程師不再擔(dān)心任務(wù)的線性吞吐量提升等非功能需求,使開發(fā)工程師能夠更加專注于面向業(yè)務(wù)編碼設(shè)計(jì);同時(shí),它能夠解放運(yùn)維工程師,使他們不必再擔(dān)心任務(wù)的可用性和相關(guān)管理需求,只通過輕松的增加服務(wù)節(jié)點(diǎn)即可達(dá)到自動(dòng)化運(yùn)維的目的。
ElasticJob 調(diào)度模型與大部分的作業(yè)平臺(tái)不同,ElasticJob 的調(diào)度模型劃分為支持線程級(jí)別調(diào)度的進(jìn)程內(nèi)調(diào)度 ElasticJob Lite,和進(jìn)程級(jí)別調(diào)度的 ElasticJob Cloud。
進(jìn)程內(nèi)調(diào)度
ElasticJob Lite 是面向進(jìn)程內(nèi)的線程級(jí)調(diào)度框架。通過 ElasticJob ,作業(yè)能夠透明化的與業(yè)務(wù)應(yīng)用系統(tǒng)相結(jié)合。它能夠方便的與 Spring 、Dubbo 等 Java 框架配合使用,在作業(yè)中可自由使用 Spring 注入的 Bean,如數(shù)據(jù)源連接池、Dubbo 遠(yuǎn)程服務(wù)等,更加方便的貼合業(yè)務(wù)開發(fā)。
ElasticJob Lite 與業(yè)務(wù)應(yīng)用部署在一起,其生命周期與業(yè)務(wù)應(yīng)用保持一致,是典型的嵌入式輕量級(jí)架構(gòu)。ElasticJob Lite 非常適合于資源使用穩(wěn)定、部署架構(gòu)簡(jiǎn)單的普通 Java 應(yīng)用,可以理解為 Java 開發(fā)框架。
ElasticJob Lite 本身是無中心化架構(gòu),無需獨(dú)立的中心化調(diào)度節(jié)點(diǎn),分布式下的每個(gè)任務(wù)節(jié)點(diǎn)均是以自調(diào)度的方式適時(shí)的調(diào)度作業(yè)。任務(wù)之間只需要一個(gè)注冊(cè)中心來對(duì)分布式場(chǎng)景下的任務(wù)狀態(tài)進(jìn)行協(xié)調(diào)即可,目前支持 ZooKeeper 和 ETCD 作為注冊(cè)中心。
架構(gòu)圖如下:

通過圖中可看出,ElasticJob Lite 的分布式作業(yè)節(jié)點(diǎn)通過選舉獲取主節(jié)點(diǎn),并通過主節(jié)點(diǎn)進(jìn)行分片。分片完畢后,主節(jié)點(diǎn)與從節(jié)點(diǎn)并無二致,均以自我調(diào)度的方式執(zhí)行任務(wù)。
進(jìn)程級(jí)調(diào)度
ElasticJob Cloud 擁有進(jìn)程內(nèi)調(diào)度和進(jìn)程級(jí)別調(diào)度兩種方式。由于 ElasticJob Cloud 能夠?qū)ψ鳂I(yè)服務(wù)器的資源進(jìn)行控制,因此其作業(yè)類型可劃分為常駐任務(wù)和瞬時(shí)任務(wù)。常駐任務(wù)類似于 ElasticJob Lite,是進(jìn)程內(nèi)調(diào)度;瞬時(shí)任務(wù)則完全不同,它充分的利用了資源分配的削峰填谷能力,是進(jìn)程級(jí)的調(diào)度,每次任務(wù)的會(huì)啟動(dòng)全新的進(jìn)程處理。
ElasticJob Cloud 需要通過 Mesos 對(duì)資源進(jìn)行控制,并且通過部署在 Mesos Master 的調(diào)度器進(jìn)行任務(wù)和資源的分配。Cloud 采用中心化架構(gòu),將調(diào)度中心的高可用交由 Mesos 管理。
它的架構(gòu)圖如下:

通過圖中可看出,ElasticJob Cloud 除了擁有 Lite 的全部能力之外,還擁有資源分配和任務(wù)分發(fā)的能力。它將作業(yè)的開發(fā)、打包、分發(fā)、調(diào)度、治理、分片等一些列的生命周期完全托管,是真正的作業(yè)云調(diào)度系統(tǒng)。
相比于 ElasticJob Lite 的簡(jiǎn)單易用,ElasticJob Cloud 對(duì) Mesos 的強(qiáng)依賴增加了系統(tǒng)部署的復(fù)雜度,因此更加適合大規(guī)模的作業(yè)系統(tǒng)。
ElasticJob 功能列表ElasticJob 功能主要有彈性調(diào)度、資源分配、作業(yè)治理和可視化管控。
彈性調(diào)度
彈性調(diào)度是 ElasticJob 最重要的功能,也是這款產(chǎn)品名稱的由來。它是一款能夠讓任務(wù)通過分片進(jìn)行水平擴(kuò)展的任務(wù)處理系統(tǒng)。
ElasticJob 中任務(wù)分片項(xiàng)的概念,使得任務(wù)可以在分布式的環(huán)境下運(yùn)行,每臺(tái)任務(wù)服務(wù)器只運(yùn)行分配給該服務(wù)器的分片。隨著服務(wù)器的增加或宕機(jī),ElasticJob 會(huì)近乎實(shí)時(shí)的感知服務(wù)器數(shù)量的變更,從而重新為分布式的任務(wù)服務(wù)器分配更加合理的任務(wù)分片項(xiàng),使得任務(wù)可以隨著資源的增加而提升效率。
舉例說明,如果作業(yè)分為 4 片,用兩臺(tái)服務(wù)器執(zhí)行,則每個(gè)服務(wù)器分到 2 片,如下圖所示。

當(dāng)新增加作業(yè)服務(wù)器時(shí),ElasticJob 會(huì)通過注冊(cè)中心的臨時(shí)節(jié)點(diǎn)的變化感知到新服務(wù)器的存在,并在下次任務(wù)調(diào)度的時(shí)候重新分片,新的服務(wù)器會(huì)承載一部分作業(yè)分片,分片如下圖所示。

當(dāng)作業(yè)服務(wù)器在運(yùn)行中宕機(jī)時(shí),注冊(cè)中心同樣會(huì)通過臨時(shí)節(jié)點(diǎn)感知,并將在下次運(yùn)行時(shí)將分片轉(zhuǎn)移至仍存活的服務(wù)器,以達(dá)到作業(yè)高可用的效果。本次由于服務(wù)器宕機(jī)而未執(zhí)行完的作業(yè),則可以通過失效轉(zhuǎn)移的方式繼續(xù)執(zhí)行。作業(yè)高可用如下圖所示。

資源分配
在導(dǎo)讀中提到過,調(diào)度是指在適合的時(shí)間將適合的資源分配給任務(wù),并使其生效。ElasticJob 具備資源分配的能力,它能夠像分布式的操作系統(tǒng)一樣調(diào)度任務(wù)。資源分配是借由 Mesos 實(shí)現(xiàn)的,由 Mesos 負(fù)責(zé)分配任務(wù)聲明的所需資源(CPU 和內(nèi)存),并將分配出去的資源進(jìn)行隔離。ElasticJob 在獲取到資源之后才會(huì)執(zhí)行任務(wù)。
考慮到 Mesos 系統(tǒng)部署相對(duì)復(fù)雜,因此 ElasticJob 將這部分拆分至 ElasticJob cloud 部分,供高級(jí)用戶使用。隨著 Kubernetes 的強(qiáng)勁發(fā)展,ElasticJob 未來也會(huì)完成 cloud 部分與它的對(duì)接。
作業(yè)治理
作業(yè)在分布式場(chǎng)景下的高可用、失效轉(zhuǎn)移、錯(cuò)過作業(yè)重新執(zhí)行等行為的治理和協(xié)調(diào)。
可視化管控端
主要包括作業(yè)的增刪改查管控端、執(zhí)行歷史記錄查詢、配置中心的管理等。
ElasticJob 典型應(yīng)用場(chǎng)景ElasticJob 著重解決與復(fù)雜任務(wù)、資源導(dǎo)向任務(wù)和業(yè)務(wù)應(yīng)用任務(wù)這幾個(gè)方面的問題。
復(fù)雜任務(wù)
數(shù)據(jù)遷移。如果將百億的數(shù)據(jù)從一組數(shù)據(jù)庫(kù)集群遷移至另一組數(shù)據(jù)庫(kù)集群,單線程的作業(yè)可能需要幾天到幾周不等。通過 ElasticJob 的彈性分片能力,可以大幅減少海量數(shù)據(jù)遷移所需要的時(shí)間。
資源導(dǎo)向任務(wù)
占用大量計(jì)算資源的報(bào)表作業(yè)。如果每天凌晨需要花費(fèi)數(shù)小時(shí)計(jì)算 T+1 的業(yè)務(wù)報(bào)表,沒有資源的管控,則無論報(bào)表作業(yè)是否啟動(dòng),都要為其分配足夠的資源。ElasticJob 將作業(yè)分為常駐作業(yè)和瞬時(shí)作業(yè),對(duì)于報(bào)表類作業(yè),瞬時(shí)作業(yè)是非常適合的。它能否在作業(yè)啟動(dòng)時(shí)獲取資源,在作業(yè)結(jié)束后歸還資源,做到真正的削峰填谷,更加合理的利用資源。
業(yè)務(wù)應(yīng)用
訂單拉取作業(yè)。訂單系統(tǒng)大多采用消息中間件或作業(yè)的方式實(shí)現(xiàn)訂單拉取,用于將訂單生成系統(tǒng)和后端履約系統(tǒng)解耦,以便于前后端流量分離。采用作業(yè)實(shí)現(xiàn)的訂單系統(tǒng),可以通過 ElasticJob 實(shí)現(xiàn)訂單相關(guān)業(yè)務(wù)邏輯,可以方便的利用外圍系統(tǒng)所提供的依賴注入服務(wù),無縫的融入業(yè)務(wù)端研發(fā)。
ElasticJob 新版本設(shè)計(jì)理念經(jīng)過了一個(gè)多月的開發(fā),ElasticJob 社區(qū)近期計(jì)劃發(fā)布 3.0.0-alpha,以作為它進(jìn)入 Apache 軟件基金會(huì)的第一個(gè)發(fā)布版本。它的主要功能包括:
作業(yè)生態(tài)圈
靈活定制化作業(yè)是 3.x 版本的最重要設(shè)計(jì)變革。新版本基于 Apache ShardingSphere 可插拔架構(gòu)的設(shè)計(jì)理念,打造了全新作業(yè) API。意在使開發(fā)者能夠更加便捷且相互隔離的方式拓展作業(yè)類型,打造 ElasticJob 作業(yè)的生態(tài)圈。
ElasticJob 提供靈活的作業(yè) API,它將作業(yè)解耦為作業(yè)接口和執(zhí)行器接口。用戶可以定制化全新的作業(yè)類型,諸如腳本執(zhí)行、HTTP 服務(wù)執(zhí)行、大數(shù)據(jù)類作業(yè)、文件類作業(yè)等。目前 ElasticJob 內(nèi)置了腳本執(zhí)行作業(yè),并且完全開放了擴(kuò)展接口,開發(fā)者可以通過 SPI 的方式引入新的作業(yè)類型,并且可以便捷的回饋至社區(qū)。
多元化調(diào)度器
在保留原有的基于 cron 的時(shí)間觸發(fā)調(diào)度器的基礎(chǔ)上,增加了一次性的調(diào)度 API,為 ElasticJob 增加了時(shí)間維度之外的全新調(diào)度維度。
微內(nèi)核 & 生態(tài)分離
抽象作業(yè)內(nèi)核模塊,將作業(yè)執(zhí)行軌跡追蹤等輔助功能以及作業(yè)生態(tài)等可擴(kuò)展模塊從內(nèi)核模塊完全抽離。作業(yè)執(zhí)行軌跡追蹤模塊作為二級(jí)生態(tài),修改了之前只支持 MySQL 作為存儲(chǔ)介質(zhì)的限制,完全開放持久化的適配。
未來規(guī)劃3.0.0 的版本作為一個(gè)快速給社區(qū)回饋的版本,并未進(jìn)行顛覆性的革新,而是嘗試將項(xiàng)目?jī)?nèi)核一點(diǎn)一滴的解耦。在未來的規(guī)劃中,ElasticJob 將大刀闊斧的向前邁進(jìn),主要的規(guī)劃如下。
作業(yè)依賴
支持基于有向無環(huán)圖(DAG)的作業(yè)依賴。依賴包含基于作業(yè)整體維度的依賴,以及基于作業(yè)分片項(xiàng)的依賴,打造更加靈活的作業(yè)治理解決方案。
調(diào)度執(zhí)行分離
將調(diào)度器和執(zhí)行器完全分離。調(diào)度器可以與執(zhí)行器一起部署,即為 ElasticJob lite 的無中心化輕量級(jí)版本;調(diào)度器可以與執(zhí)行器分離部署,即為 ElasticJob cloud 的資源管控的一站式分布式調(diào)度系統(tǒng)。
更加易用的云管產(chǎn)品
將目前僅支持 Mesos 的 ElasticJob cloud 打造為支持 Mesos 和 Kubernetes 的作業(yè)云管平臺(tái),并提供無 Mesos 和 Kubernetes 也能夠獨(dú)立使用的不包含資源管控的純作業(yè)管控平臺(tái)。
可插拔生態(tài)
與 Apache ShardingSphere 一脈相承,ElasticJob 也將提供更加可插拔和模塊化架構(gòu),為開發(fā)者提供基礎(chǔ)設(shè)施。開發(fā)者可以方便的基于 ElasticJob 二次開發(fā),添加各種定制化功能,包括但不限于作業(yè)類型(如:大數(shù)據(jù)作業(yè)、HTTP 作業(yè)等)、注冊(cè)中心類型(如:Eureka 等)、執(zhí)行軌跡存儲(chǔ)介質(zhì)(如其他數(shù)據(jù)庫(kù)類型)等。ElasticJob 的定位如下圖所示。

ElasticJob 社區(qū)在之前的幾年處于停滯狀況,主要原因是作者精力有限,分身乏術(shù)。在接收到了作為 Apache ShardingSphere 彈性遷移的調(diào)度基礎(chǔ)設(shè)施的需求之后,本就一脈相承的 ElasticJob 社區(qū)決定重啟,并且作為 Apache ShardingSphere 的子項(xiàng)目繼續(xù)發(fā)光發(fā)熱。目前的 ElasticJob 已正式將項(xiàng)目源碼遷入 Apache 的 GitHub 倉(cāng)庫(kù),并且在重啟的一個(gè)多月以來十分活躍,已完成了上百個(gè) Pull Request 的開發(fā),在 GitHub 周和月度趨勢(shì)排名中榜上有名。
ElasticJob 是 Apache ShardingSphere 的子項(xiàng)目,目標(biāo)是成為獨(dú)立的 Apache 頂級(jí)項(xiàng)目,以及為 Apache ShardingSphere 的彈性遷移提供數(shù)據(jù)調(diào)度的基石。
歡迎開源愛好者加入 ElasticJob 社區(qū)的建設(shè)。
GitHub 地址:https://github.com/apache/shardingsphere-elasticjob-lite
官方網(wǎng)站:http://shardingsphere.apache.org/elasticjob/
作者簡(jiǎn)介:
張亮,京東數(shù)科數(shù)據(jù)研發(fā)負(fù)責(zé)人,Apache ShardingSphere 創(chuàng)始人 & 項(xiàng)目 VP、ElasticJob 創(chuàng)始人。
熱愛開源,主導(dǎo)開源項(xiàng)目 ShardingSphere (原名 Sharding-JDBC) 和 Elastic-Job。擅長(zhǎng)以 Java 為主分布式架構(gòu),推崇優(yōu)雅代碼,對(duì)如何寫出具有展現(xiàn)力的代碼有較多研究。
目前主要精力投入在將 Apache ShardingSphere 打造為業(yè)界一流的金融級(jí)數(shù)據(jù)解決方案之上。Apache ShardingSphere 是 Apache 軟件基金會(huì)旗下的頂級(jí)項(xiàng)目,也是 Apache 軟件基金會(huì)首個(gè)分布式數(shù)據(jù)庫(kù)中間件。
往期推薦
Spring Boot 2.x基礎(chǔ)教程:事務(wù)管理入門
說實(shí)話,Intellij IDEA 自帶的 Vim 插件真心不錯(cuò)!
「程序猿 DD」星球活動(dòng)第一期正式開啟!點(diǎn)擊了解!
立省 ¥100 ,到手僅 ¥99,即將 漲價(jià)至 ¥299。
支持 3 天無理由退款,機(jī)不可失時(shí)不再來,趕緊加入吧 ~
