架構(gòu)
Elastic-Job是一個分布式調(diào)度解決方案,由兩個相互獨立的子項目Elastic-Job-Lite和Elastic-Job-Cloud組成。實際上我司在用的是Elatic-Job-Lite,所以本文只討論Elastic-Job-Lite。Elastic-Job-Lite定位為輕量級無中心化解決方案,使用jar包的形式提供分布式任務(wù)的協(xié)調(diào)服務(wù)。

從上圖左上角可知,Elastic-Job不是獨立部署的,而是被業(yè)務(wù)系統(tǒng)依賴jar;用zookeeper作為分布式協(xié)調(diào),Elatic-Job將作業(yè)、服務(wù)器、數(shù)據(jù)分片等等信息注冊到zookeeper,并監(jiān)控zookeeper數(shù)據(jù),而運維平臺console和Elastic-Job-Lite并無直接關(guān)系,console只是查詢了zookeeper節(jié)點的數(shù)據(jù)狀態(tài),當(dāng)然也能通過接口改變zookeeper的數(shù)據(jù)。
概述
elastic-job 主要的設(shè)計理念是無中心化的分布式定時調(diào)度框架,思路來源于 Quartz 的基于數(shù)據(jù)庫的高可用方案。但數(shù)據(jù)庫沒有分布式協(xié)調(diào)功能,所以在高可用方案的基礎(chǔ)上增加了彈性擴容和數(shù)據(jù)分片的思路,以便于更大限度的利用分布式服務(wù)器的資源。
由上可知,elastic-job并無統(tǒng)一調(diào)度中心,每個運行在集群中的作業(yè)服務(wù)器都是對等的,節(jié)點之間通過注冊中心進行分布式協(xié)調(diào)。但 elastic-job 有主節(jié)點的概念,主節(jié)點用于處理一些集中式任務(wù),如分片,清理運行時信息等,并無調(diào)度功能,定時調(diào)度都是由作業(yè)服務(wù)器自行觸發(fā);elastic-job的設(shè)計參考了Quaetz基于數(shù)據(jù)庫的高可用性方案,所以elastic-job的核心功能其實和Quartz差不多,只是Quartz是基于數(shù)據(jù)庫,而elastic-job是基于Zookeeper;elastic-job的數(shù)據(jù)分片是一大特性,可以更大限度的利用分布式服務(wù)器的資源。
代碼目錄結(jié)構(gòu)

主要功能
a) 分布式:重寫 Quartz 基于數(shù)據(jù)庫的分布式功能,改用 Zookeeper 實現(xiàn)注冊中心。
b) 并行調(diào)度:采用任務(wù)分片方式實現(xiàn)。將一個任務(wù)拆分為 n 個獨立的任務(wù)項,由分布式的服務(wù)器并行執(zhí)行各自分配到的分片項。
c) 彈性擴容縮容:將任務(wù)拆分為 n 個任務(wù)項后,各個服務(wù)器分別執(zhí)行各自分配到的任務(wù)項。一旦有新的服務(wù)器加入集群,或現(xiàn)有服務(wù)器下線,elastic-job 將在保留本次任務(wù)執(zhí)行不變的情況下,下次任務(wù)開始前觸發(fā)任務(wù)重分片。
d) 集中管理:采用基于 Zookeeper 的注冊中心,集中管理和協(xié)調(diào)分布式作業(yè)的狀態(tài),分配和監(jiān)聽。外部系統(tǒng)可直接根據(jù) Zookeeper 的數(shù)據(jù)管理和監(jiān)控 elastic-job。
e) 定制化流程型任務(wù):作業(yè)可分為簡單和數(shù)據(jù)流處理兩種模式,數(shù)據(jù)流又分為高吞吐處理模式和順序性處理模式,其中高吞吐處理模式可以開啟足夠多的線程快速的處理數(shù)據(jù),而順序性處理模式將每個分片項分配到一個獨立線程,用于保證同一分片的順序性,這點類似于 kafka 的分區(qū)順序性。
以上d),外部系統(tǒng)可直接根據(jù)zookeeper的數(shù)據(jù)管理和監(jiān)控elastic-job。這是因為elastic-job會把作業(yè)、服務(wù)器、分片信息等注冊到zookeeper,Zookeeper目前的znode分四類,config,servers,execution,leader。config用于保存分布式作業(yè)的全局控制,如,分多少片,要不要執(zhí)行misfire,cron表達式。servers用于注冊作業(yè)服務(wù)器狀態(tài)和分片信息。execution以分片的維度存儲作業(yè)運行時狀態(tài)。leader用于存儲主節(jié)點。elastic-job作業(yè)執(zhí)行是無中心化的,但主節(jié)點起到協(xié)調(diào)的作用,如:重分片、清理上次運行時信息等。運維平臺console和elastic-job-lite并無直接關(guān)系,是通過讀取作業(yè)注冊中心數(shù)據(jù)展現(xiàn)作業(yè)狀態(tài),或更新注冊中心數(shù)據(jù)修改全局配置;而可以通過運維平臺操作作業(yè)觸發(fā)、暫停、下線、恢復(fù),則是利用了zookeeper的監(jiān)控watch特性,elastic-job-lite會監(jiān)聽zookeeper的狀態(tài),然后再調(diào)用Quartz的接口實現(xiàn)的。