天天看點

elastic job 簡單高可用機制

場景

定時任務配置

<job:simple id="springSimpleJob"
            class="com.dangdang.ddframe.job.example.job.simple.SpringSimpleJob"
            registry-center-ref="regCenter"
            sharding-total-count="2"
            cron="0/5 * * * * ?"
            overwrite="true"
/>
           

假設目前有兩個伺服器節點,根據預設分片算法,每個節點會執行一個分片的定時任務,如下

elastic job 簡單高可用機制
elastic job 簡單高可用機制

當分片0的伺服器節點當機時,分片0的任務會由分片1的伺服器節點承接,這就是簡單的HA。

原理分析

  • elastic  job初始化

elastic job 簡單高可用機制

在調用初始化方法時會注冊各種監聽,其中ListenServersChangedJobListener就是完成失效分片轉移的監聽

elastic job 簡單高可用機制

當某一個伺服器當機時,那麼就會觸發監聽機制,在zookeeper服務端注冊necessary節點,該節點就是辨別需要重新執行分片。

  • 定時任務執行(LiteJob)
elastic job 簡單高可用機制
jobFacade.getShardingContexts() 擷取分片資訊
    shardingService.shardingIfNecessary(); 判斷是否需要重新分片
           
elastic job 簡單高可用機制

該方法中執行邏輯是判斷之前監聽設定的necessary節點是否存在,如果不存在則不需要重新分片直接傳回。

leaderService.isLeaderUntilBlock()方法首先會完成選主,因為隻有主節點才能完成分片任務,如果目前的伺服器

是主節點,那麼就會執行下面代碼邏輯,而其他節點則處于等待狀态,等待主節點完成分片任務。分片算法完成之後

會将分片資訊送出到zookeeper服務端,并且會删除necessary和processing标志,是以整個操作會在事務中執行。

elastic job 簡單高可用機制

執行完分片之後目前伺服器會擷取配置設定在本伺服器的分片,如果分片為空則不會執行任務,按本文的場景目前伺服器會擷取兩個分片

elastic job 簡單高可用機制

傳回執行分片清單如上圖。最後會線上程池中送出兩個分片任務如下圖。

elastic job 簡單高可用機制
  • 執行流程
elastic job 簡單高可用機制