開篇語
程式=資料結構+演算法,由此可見,資料結構是多麼的重要,任何一個框架底層都有自己資料儲存結構,elastic-job-lite是一個開源的分散式任務排程框架,其基於zk來儲存執行時job資訊,配置資訊等等,也就是說zk是它的註冊中心,所以它的資料結構也和zk有關,今天我們就一起聊聊elastic-job-lite資料結構,一起揭開它的神秘面紗。
EJL資料結構整體概要介紹
在ejl中資料結構的根節點是名稱空間,由開發人員在zk的配置中指定,如下程式碼,ejl中的資料結構都在zk的名稱空間下存在(也就是可以同一zk叢集,可以基於名稱空間做隔離)
regCenter:
serverList: x.x.x.x:2181,x.x.x.x:2181
namespace: bs
在名稱空間之下,存放各個job的名稱,透過jobName用來做區分,JobName就是類的全限定名稱,比如com.xxx.job.SimpleJobTest;在jobName下,就是各個Job的資料結構了,總的來說如下:
- name_space1 名稱空間1
- jobName1 作業名稱2
- ConfigurationNode /confg 作業的配置資訊
- LeaderNode /leader 作業的主節點選舉資訊
- FailoverNode /failover 作業失效轉移資訊
- GuaranteeNode /guarantee 作業分散式全部開始和結束資訊
- InstanceNode /instance 作業執行例項資訊
- ServerNode /servers 叢集伺服器資訊
- ShardingNode /sharding 作業分片資訊
- jobName2 作業名稱2
- ......
- jobName1 作業名稱2
- name_space2 名稱空間2
- ......
上面整體描述了作業的資料結構,那麼這些資料結構是怎麼操作呢?在ejl中,存在這麼一個服務:io.elasticjob.lite.internal.storage.JobNodeStorage,透過此類來操作job的各個節點(增刪改查),這個類比較偏底層,事實上,每個資料結構都有對應的一個服務(比如ConfigurationService...等),服務中統一呼叫JobNodeStorage來具體來實現,具體方法如下
細節介紹
透過上面我們整理我們對ejl的資料結構整體有了清晰的認識,ejl的資料結構就是一個tree,或者你理解為一個目錄,一級一級的,接下來我們就深入看一下資料結構中每一個節點的作用,在此之前,我們假設我們的namespace的名稱為,cluster1,有一個job,job的名稱為com.xxx.job.SimpleJobTest,那麼資料結構的字首如下:我們為字首起一個別名: cs
/cluster1/com.xxx.job.SimpleJobTest/ -> cs
ConfigurationNode
其在zk中表示為下: /cs/conifg
,這個節點中儲存是的job的配置資訊,字串形式
LeaderNode
這個是job分散式鎖的根節點,在zk中表示如下:/cs/leader/
,在下面還有多級節點,如下:
- election
- latch 這是job選舉leader的分散式鎖
- instance 這是選舉成功後儲存leader節點的job名稱
FailoverNode
失效轉移節點是基於leader的,也就是說failover也是在leader下面,因為是功能不一樣,所以沒放在上面,在zk中表示為下:/cs/leader/failover/
,在下面也有多級節點:
- items 這個節點下面存放的失效轉移的分片,判斷是否需要失效轉移,也就是判斷這個節點下面是否有資料
- latch 執行失效轉移時的分散式鎖,誰獲得了鎖,誰處理這個分片的資料
GuaranteeNode
這個節點是統一作業各個分片一起開始執行,到最後全部完成執行結束,在zk中表示如下:/cs/guarantee/
,舉個例子,比如想在作業執行前和執行後做一些事情,但因為作業是分散式的,怎麼搞呢?每個節點在執行前同一個往一個地方寫一個標記,大家標記都寫好了,就意味著大家都準備好了,可以開執行了,這個時候可以加個監聽器做一點事情(日誌列印),等每個節點都執行完了,也寫一個標記,最終所有節點寫完了,也加個監聽器做一點事情(資源清理),在下面有兩個多級節點:
- started 作業開始每個節點往這裡寫標記
- completed 作業完成後每個節點往這裡寫標記
InstanceNode
這個節點是儲存作業執行的例項資訊,也就是這個job由那些例項執行呢,在zk中表示為: /cs/instances/
,對應的資料就是例項的ip
ServerNode
這個節點用來儲存叢集伺服器的資訊,就是說有多少機器在zk中註冊,在zk的中表示如下:/cs/servers/
,儲存的資料是機器的ip。
ShardingNode
這個節點也依賴leader節點,作用是否需要失效轉移?這個節點主要儲存作業的分片資訊,在zk中表示為:/cs/sharding/
,在下面有多個多級節點
依賴leader
/leader/sharding/necessary 作用是每次作業啟動時檢查是否需要重新分片,如果這個節點存在,說明需要重新分片,分片結束後刪除,當分片總數增加,或者有分片機器下線時,會設定此節點
/leader/sharding/processing 當開始重新分片時,會建立這個節點,分片結束後刪除這個節點
不依賴leader
instance 儲存當前分片的例項資訊
running 儲存正在執行的分片項
misfire 當該作業被錯過執行時,該節點存在,當被執行後,該節點刪除
disabled 當作業該分片被禁用時,節點存在,開啟時,刪除
上面我們詳細描述job的各個資料結構,並表明了其作用,大家可結合上原始碼一起學習,進入原始碼的資料結構class中。具體哪個類,上面以寫明。
整理
最後把涉及的資料結構整理成一個表格,大家一目瞭然
本作品採用《CC 協議》,轉載必須註明作者和本文連結