elastic-job-lite 資料結構分析

a_wei發表於2019-09-29

開篇語

程式=資料結構+演算法,由此可見,資料結構是多麼的重要,任何一個框架底層都有自己資料儲存結構,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
      • ......
  • name_space2 名稱空間2
    • ......

上面整體描述了作業的資料結構,那麼這些資料結構是怎麼操作呢?在ejl中,存在這麼一個服務:io.elasticjob.lite.internal.storage.JobNodeStorage,透過此類來操作job的各個節點(增刪改查),這個類比較偏底層,事實上,每個資料結構都有對應的一個服務(比如ConfigurationService...等),服務中統一呼叫JobNodeStorage來具體來實現,具體方法如下

elastic-job-lite 資料結構分析

細節介紹

透過上面我們整理我們對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中。具體哪個類,上面以寫明。

整理

最後把涉及的資料結構整理成一個表格,大家一目瞭然

elastic-job-lite 資料結構分析

elastic-job-lite 資料結構分析

本作品採用《CC 協議》,轉載必須註明作者和本文連結
那小子阿偉

相關文章