ElasticJob 的產品定位與新版本設計理念

導讀:調度(Scheduling)在計算機領域是個龐大概念,CPU調度、內存調度、進程調度等都可稱之爲調度。它是指在特定的時機分配合理的資源去處理預先確定的任務,用於在適當的時機觸發一個包含業務邏輯的應用。調度無論在單機還是分佈式環境中都是很重要的課題。在單機環境,調度與底層操作系統脫離不了干係;而在分佈式環境中,調度直接決定運行集羣的投入和產出。調度的兩個核心要素是資源治理和觸發時機。

背景

ElasticJob 誕生於 2015年,當時業界雖然有 QuartZ 等出類拔萃的定時任務框架,但缺乏分佈式方面的探索。分佈式調度雲平臺產品的缺失,使得 ElasticJob 從出現伊始便備受關注。它有效的彌補了作業在分佈式領域的短板,並且提供了一站式的自動化運維管控端。

ElasticJob 在技術選型時,選擇站在了巨人的肩膀上而不是重複製造輪子的理念,將定時任務事實標準的 QuartZ 與 分佈式協調的利器 ZooKeeper 完美結合,快速而穩定的搭建了全新概念的分佈式調度框架。

ElasticJob是什麼?

ElasticJob 是一個分佈式調度解決方案,由兩個相互獨立的子項目 ElasticJob Lite 和 ElasticJob Cloud 組成。ElasticJob Lite 定位爲輕量級無中心化解決方案,使用 jar 的形式提供分佈式任務的協調服務;ElasticJob Cloud 採用自研 Mesos Framework 的解決方案,額外提供資源治理、應用分發以及進程隔離等功能。它通過彈性調度、資源管控、以及作業治理的功能,打造一個適用於互聯網場景的分佈式調度解決方案,並通過開放的架構設計,提供多元化的作業生態。

使用 ElasticJob 能夠讓開發工程師不再擔心任務的線性吞吐量提升等非功能需求,使開發工程師能夠更加專注於面向業務編碼設計;同時,它能夠解放運維工程師,使他們不必再擔心任務的可用性和相關管理需求,只通過輕鬆的增加服務節點即可達到自動化運維的目的。

ElasticJob調度模型

與大部分的作業平臺不同,ElasticJob 的調度模型劃分爲支持線程級別調度的進程內調度 ElasticJob Lite,和進程級別調度的ElasticJob Cloud。

進程內調度

ElasticJob Lite 是面向進程內的線程級調度框架。通過 ElasticJob ,作業能夠透明化的與業務應用系統相結合。它能夠方便的與 Spring 、Dubbo等 Java 框架配合使用,在作業中可自由使用 Spring 注入的 Bean,如數據源連接池、Dubbo 遠程服務等,更加方便的貼合業務開發。

ElasticJob Lite與業務應用部署在一起,其生命週期與業務應用保持一致,是典型的嵌入式輕量級架構。ElasticJob Lite 非常適合於資源使用穩定、部署架構簡單的普通 Java 應用,可以理解爲 Java 開發框架。

ElasticJob Lite 本身是無中心化架構,無需獨立的中心化調度節點,分佈式下的每個任務節點均是以自調度的方式適時的調度作業。任務之間只需要一個註冊中心來對分佈式場景下的任務狀態進行協調即可,目前支持 ZooKeeper 和 ETCD 作爲註冊中心。

架構圖如下:

通過圖中可看出,ElasticJob Lite 的分佈式作業節點通過選舉獲取主節點,並通過主節點進行分片。分片完畢後,主節點與從節點並無二致,均以自我調度的方式執行任務。

進程級調度

ElasticJob Cloud 擁有進程內調度和進程級別調度兩種方式。由於 ElasticJob Cloud 能夠對作業服務器的資源進行控制,因此其作業類型可劃分爲常駐任務和瞬時任務。常駐任務類似於ElasticJob Lite,是進程內調度;瞬時任務則完全不同,它充分的利用了資源分配的削峯填谷能力,是進程級的調度,每次任務的會啓動全新的進程處理。

ElasticJob Cloud 需要通過 Mesos 對資源進行控制,並且通過部署在 Mesos Master的調度器進行任務和資源的分配。Cloud採用中心化架構,將調度中心的高可用交由 Mesos管理。

它的架構圖如下:

通過圖中可看出,ElasticJob Cloud 除了擁有 Lite 的全部能力之外,還擁有資源分配和任務分發的能力。它將作業的開發、打包、分發、調度、治理、分片等一些列的生命週期完全託管,是真正的作業雲調度系統。

相比於 ElasticJob Lite 的簡單易用,ElasticJob Cloud 對 Mesos 的強依賴增加了系統部署的複雜度,因此更加適合大規模的作業系統。

ElasticJob功能列表

ElasticJob 功能主要有彈性調度、資源分配、作業治理和可視化管控。

彈性調度

彈性調度是 ElasticJob 最重要的功能,也是這款產品名稱的由來。它是一款能夠讓任務通過分片進行水平擴展的任務處理系統。

ElasticJob 中任務分片項的概念,使得任務可以在分佈式的環境下運行,每臺任務服務器只運行分配給該服務器的分片。隨着服務器的增加或宕機,ElasticJob 會近乎實時的感知服務器數量的變更,從而重新爲分佈式的任務服務器分配更加合理的任務分片項,使得任務可以隨着資源的增加而提升效率。

舉例說明,如果作業分爲 4 片,用兩臺服務器執行,則每個服務器分到 2 片,如下圖所示。

當新增加作業服務器時,ElasticJob 會通過註冊中心的臨時節點的變化感知到新服務器的存在,並在下次任務調度的時候重新分片,新的服務器會承載一部分作業分片,分片如下圖所示。

當作業服務器在運行中宕機時,註冊中心同樣會通過臨時節點感知,並將在下次運行時將分片轉移至仍存活的服務器,以達到作業高可用的效果。本次由於服務器宕機而未執行完的作業,則可以通過失效轉移的方式繼續執行。作業高可用如下圖所示。

資源分配

在導讀中提到過,調度是指在適合的時間將適合的資源分配給任務,並使其生效。ElasticJob 具備資源分配的能力,它能夠像分佈式的操作系統一樣調度任務。資源分配是藉由 Mesos 實現的,由 Mesos 負責分配任務聲明的所需資源(CPU 和內存),並將分配出去的資源進行隔離。ElasticJob 在獲取到資源之後纔會執行任務。

考慮到 Mesos 系統部署相對複雜,因此 ElasticJob 將這部分拆分至 ElasticJob cloud 部分,供高級用戶使用。隨着 Kubernetes 的強勁發展,ElasticJob 未來也會完成 cloud 部分與它的對接。

作業治理

作業在分佈式場景下的高可用、失效轉移、錯過作業重新執行等行爲的治理和協調。

可視化管控端

主要包括作業的增刪改查管控端、執行歷史記錄查詢、配置中心的管理等。

ElasticJob典型應用場景

ElasticJob着重解決與複雜任務、資源導向任務和業務應用任務這幾個方面的問題。

複雜任務

數據遷移。如果將百億的數據從一組數據庫集羣遷移至另一組數據庫集羣,單線程的作業可能需要幾天到幾周不等。通過 ElasticJob 的彈性分片能力,可以大幅減少海量數據遷移所需要的時間。

資源導向任務

佔用大量計算資源的報表作業。如果每天凌晨需要花費數小時計算 T+1 的業務報表,沒有資源的管控,則無論報表作業是否啓動,都要爲其分配足夠的資源。ElasticJob 將作業分爲常駐作業和瞬時作業,對於報表類作業,瞬時作業是非常適合的。它能否在作業啓動時獲取資源,在作業結束後歸還資源,做到真正的削峯填谷,更加合理的利用資源。

業務應用

訂單拉取作業。訂單系統大多采用消息中間件或作業的方式實現訂單拉取,用於將訂單生成系統和後端履約系統解耦,以便於前後端流量分離。採用作業實現的訂單系統,可以通過 ElasticJob 實現訂單相關業務邏輯,可以方便的利用外圍系統所提供的依賴注入服務,無縫的融入業務端研發。

ElasticJob 新版本設計理念

經過了一個多月的開發,ElasticJob 社區近期計劃發佈3.0.0-alpha,以作爲它進入 Apache 軟件基金會的第一個發佈版本。它的主要功能包括:

作業生態圈

靈活定製化作業是3.x版本的最重要設計變革。新版本基於 Apache ShardingSphere 可插拔架構的設計理念,打造了全新作業 API。意在使開發者能夠更加便捷且相互隔離的方式拓展作業類型,打造 ElasticJob 作業的生態圈。

ElasticJob 提供靈活的作業API,它將作業解耦爲作業接口和執行器接口。用戶可以定製化全新的作業類型,諸如腳本執行、HTTP服務執行、大數據類作業、文件類作業等。目前 ElasticJob 內置了腳本執行作業,並且完全開放了擴展接口,開發者可以通過 SPI 的方式引入新的作業類型,並且可以便捷的回饋至社區。

多元化調度器

在保留原有的基於 cron 的時間觸發調度器的基礎上,增加了一次性的調度 API,爲 ElasticJob 增加了時間維度之外的全新調度維度。

微內核 & 生態分離

抽象作業內核模塊,將作業執行軌跡追蹤等輔助功能以及作業生態等可擴展模塊從內核模塊完全抽離。作業執行軌跡追蹤模塊作爲二級生態,修改了之前只支持MySQL 作爲存儲介質的限制,完全開放持久化的適配。

未來規劃

3.0.0的版本作爲一個快速給社區回饋的版本,並未進行顛覆性的革新,而是嘗試將項目內核一點一滴的解耦。在未來的規劃中,ElasticJob 將大刀闊斧的向前邁進,主要的規劃如下。

作業依賴

支持基於有向無環圖(DAG)的作業依賴。依賴包含基於作業整體維度的依賴,以及基於作業分片項的依賴,打造更加靈活的作業治理解決方案。

調度執行分離

將調度器和執行器完全分離。調度器可以與執行器一起部署,即爲 ElasticJob lite 的無中心化輕量級版本;調度器可以與執行器分離部署,即爲ElasticJob cloud 的資源管控的一站式分佈式調度系統。

更加易用的雲管產品

將目前僅支持 Mesos 的 ElasticJob cloud 打造爲支持 Mesos 和 Kubernetes的作業雲管平臺,並提供無 Mesos 和 Kubernetes 也能夠獨立使用的不包含資源管控的純作業管控平臺。

可插拔生態

與 Apache ShardingSphere 一脈相承,ElasticJob 也將提供更加可插拔和模塊化架構,爲開發者提供基礎設施。開發者可以方便的基於 ElasticJob 二次開發,添加各種定製化功能,包括但不限於作業類型(如:大數據作業、HTTP作業等)、註冊中心類型(如:Eureka等)、執行軌跡存儲介質(如其他數據庫類型)等。ElasticJob的定位如下圖所示。

關於 ElasticJob 社區

ElasticJob 社區在之前的幾年處於停滯狀況,主要原因是作者精力有限,分身乏術。在接收到了作爲 Apache ShardingSphere 彈性遷移的調度基礎設施的需求之後,本就一脈相承的 ElasticJob 社區決定重啓,並且作爲 Apache ShardingSphere 的子項目繼續發光發熱。目前的 ElasticJob 已正式將項目源碼遷入 Apache 的 GitHub 倉庫,並且在重啓的一個多月以來十分活躍,已完成了上百個Pull Request的開發,在GitHub 周和月度趨勢排名中榜上有名。

ElasticJob 是Apache ShardingSphere 的子項目,目標是成爲獨立的 Apache 頂級項目,以及爲 Apache ShardingSphere 的彈性遷移提供數據調度的基石。

歡迎開源愛好者加入 ElasticJob 社區的建設。

GitHub地址:
https://github.com/apache/shardingsphere-elasticjob-lite

官方網站:
http://shardingsphere.apache.org/elasticjob/

作者簡介:

張亮,京東數科數據研發負責人,Apache ShardingSphere創始人 & 項目VP、ElasticJob創始人。

熱愛開源,主導開源項目 ShardingSphere (原名 Sharding-JDBC) 和 Elastic-Job。擅長以Java 爲主分佈式架構,推崇優雅代碼,對如何寫出具有展現力的代碼有較多研究。

目前主要精力投入在將 Apache ShardingSphere 打造爲業界一流的金融級數據解決方案之上。Apache ShardingSphere 是 Apache軟件基金會旗下的頂級項目,也是 Apache 軟件基金會首個分佈式數據庫中間件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章