分布式定時任務(wù)elastic-job(四)

目錄

目錄.png

分布式定時任務(wù)系列


自診斷恢復(fù)

  • 解決分布式作業(yè)不一致狀態(tài)ReconcileService,AbstractScheduledService是guava提供的,scheduler方法配合runOneIteration,定時操作


    ReconcileService.png
  • 如果是主作業(yè)節(jié)點 而且 當(dāng)前作業(yè)不需要重新分片 而且 查詢是包含有分片節(jié)點的不在線服務(wù)器,那么設(shè)置需要重新分片的標(biāo)記。這樣達(dá)到自診斷修復(fù)
// 定時每分鐘執(zhí)行的方法
@Override
protected void runOneIteration() throws Exception {
   LiteJobConfiguration config = configService.load(true);
   int reconcileIntervalMinutes = null == config ? -1 : config.getReconcileIntervalMinutes();
   if (reconcileIntervalMinutes > 0 && (System.currentTimeMillis() - lastReconcileTime >= reconcileIntervalMinutes * 60 * 1000)) { // 校驗是否達(dá)到校驗周期
       // 設(shè)置最后校驗時間
       lastReconcileTime = System.currentTimeMillis();
       // 主作業(yè)節(jié)點 而且 當(dāng)前作業(yè)不需要重新分片 而且 查詢是包含有分片節(jié)點的不在線服務(wù)器
       if (leaderService.isLeaderUntilBlock() 
               && !shardingService.isNeedSharding() 
               && shardingService.hasShardingInfoInOfflineServers()) {
           log.warn("Elastic Job: job status node has inconsistent value,start reconciling...");
           // 設(shè)置需要重新分片的標(biāo)記
           shardingService.setReshardingFlag();
       }
   }
}

// 定時每分鐘執(zhí)行
@Override
protected Scheduler scheduler() {
    return Scheduler.newFixedDelaySchedule(0, 1, TimeUnit.MINUTES);
}

事件追蹤

  • 基于guava的EventBus實現(xiàn),是一種優(yōu)雅的觀察者模式實現(xiàn)方式。
  • 兩種作業(yè)事件
    JobStatusTraceEvent, 作業(yè)狀態(tài)追蹤事件,比如五個分片就記錄一條, 整體的狀態(tài)
    JobExecutionEvent, 作業(yè)執(zhí)行追蹤事件,比如五個分片記錄每個分片執(zhí)行的情況
  • JobEventRdbStorage, 作業(yè)事件數(shù)據(jù)庫存儲, 存儲時是用jdbc執(zhí)行的,基于數(shù)據(jù)庫的操作,查詢也是基于數(shù)據(jù)庫查詢
  • 當(dāng)然也可以自定義事件追蹤,比如es實現(xiàn),通過配置JobEventConfig中JobEventListener自定義就可以實現(xiàn)了
// JobEventBus注冊監(jiān)聽器,不同監(jiān)聽器可以實現(xiàn)不同的存儲方式,比如默認(rèn)的關(guān)系型數(shù)據(jù)庫存儲
private void register() {
    try {
        eventBus.register(jobEventConfig.createJobEventListener());
        isRegistered = true;
    } catch (final JobEventListenerConfigurationException ex) {
        log.error("Elastic job: create JobEventListener failure, error is: ", ex);
    }
}

elastic-job cloud

  • 額外提供了進(jìn)程隔離之類的,瞬時任務(wù)提供進(jìn)程級調(diào)度場景mesos是c++寫的, 瞬時任務(wù)是cloud提供的能力,長時間執(zhí)行資源不緊張時,創(chuàng)建進(jìn)程,執(zhí)行完,銷毀進(jìn)程,nginx也是進(jìn)程級的
  • elastic-Job-cloud使用Mesos + Docker(TBD)的解決方案,額外提供資源治理, 應(yīng)用分發(fā)以及進(jìn)程隔離等服務(wù)

elastic-job的一些思考

  • 用分布式鎖進(jìn)行失效任務(wù)拿取是為了集群能力能提供服務(wù),有master節(jié)點是為了分配分片之類的這樣就不用每次獲取分布式鎖了,簡單高效
  • elastic-job異常情況
  1. 擴(kuò)容收容 有監(jiān)聽
  2. 宕機(jī)
  3. zk失連 又連上
  4. 分片時節(jié)點下線,先選主再分片
  • 這種主節(jié)點選舉方式有可能腦裂?實際上elastic-job用了zk分布式鎖,zk分布式鎖后續(xù)可以深入研究下,zk本身也能防止腦裂,而且連不上zk的作業(yè)服務(wù)器將立刻停止執(zhí)行作業(yè),防止主節(jié)點已重新分片,而腦裂的服務(wù)器還在執(zhí)行
  • elastic-job無中心的思想,cloud是中心化外提供了高級特性
  • elastic-job通過zk節(jié)點變化感知服務(wù)上線下線,連接失連,感知后,可以通過代碼保證高可用

分布式定時任務(wù)技術(shù)選型

quartz

  • 不提供分布式

xxl-job

  • 基于數(shù)據(jù)庫,瓶頸在數(shù)據(jù)庫,適合服務(wù)時的情況,服務(wù)量大,數(shù)據(jù)庫壓力大,性能下降,個人維護(hù)

elastic-job

  • lite無中心化,適合服務(wù)多,量大,性能不受數(shù)據(jù)庫影響,當(dāng)當(dāng)維護(hù)貢獻(xiàn)給apache了

其他

  • 其他的開源框架文檔少

總結(jié)

  • 借用參考文章7的圖


    總結(jié).png

參考文章

  1. 腦裂是什么?Zookeeper是如何解決的?
  2. Kafka研究系列之kafka 如何避免腦裂?如何選舉leader
  3. 如何防止ElasticSearch集群出現(xiàn)腦裂現(xiàn)象
  4. elastic-job調(diào)度模型
  5. 芋道源碼-elastic-job
  6. Quartz原理解密
  7. 分布式定時任務(wù)調(diào)度系統(tǒng)技術(shù)選型
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容