天天看點

java定時任務架構quartz、elastic-job和xxl-job的分析對比(個人總結)定時任務架構quartz、elastic-job和xxl-job分析

參考視訊教程:  

 精講Elastic-job + Quartz實作企業級定時任務 

\<article class="baidu_pl" style="box-sizing: inherit; outline: 0px; margin: 0px; padding: 16px 0px 0px; display: block; position: relative; color: rgba(0, 0, 0, 0.75); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: common-ligatures; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"\>

版權聲明:本文為部落客原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結和本聲明。

本文連結:https://blog.csdn.net/LWS826528071/article/details/94394249

定時任務架構quartz、elastic-job和xxl-job分析

  • 一、概述
  • 二、對比
  • 三、總結
  • 四、分析elastic-job-lite架構
  • 4.1 概述
  • 4.2 架構圖
  • 4.3 作業啟動流程圖
  • 4.4 作業執行流程圖
  • 4.5 功能清單
  • 4.6 基本概念
  • 4.7核心理念

(說明:開發中遇到需要做定時任務的需求,之前查閱了很多資料,比較雜亂,一直沒有時間做個整理。第一版用的是quartz,能滿足大部分功能,但是老大說要考慮到後期系統的健壯性和拓展性,quartz還是有很多局限的,綜合考量下,決定用ealstic-job架構來重構,本文着重分析此架構。其中有很多内容是從其他人的部落格中摘抄過來的,記不太清了,如有冒犯,請聯系處理!)

  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>Quartz\</mark\>:
    • Java上的定時任務标準。但Quartz關注點在于定時任務而非資料,并無一套根據資料處理而定制化的流程。雖然Quartz可以基于資料庫實作作業的高可用,但缺少分布式并行排程的功能
  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>elastic-job\</mark\>:
    • 當當開發的彈性分布式任務排程系統,功能豐富強大,采用zookeeper實作分布式協調,實作任務高可用以及分片,目前是版本2.1.5,并且可以支援雲開發
  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>xxl-job\</mark\>:
    • 是大衆點評員工徐雪裡于2015年釋出的分布式任務排程平台,是一個輕量級分布式任務排程架構,其核心設計目标是開發迅速、學習簡單、輕量級、易擴充。

對比項 Quartz elastic-job xxl-job
依賴 mysql jdk1.7+, zookeeper 3.4.6+ ,maven3.0.4+ ,mesos mysql ,jdk1.7+ , maven3.0+
叢集、彈性擴容 多節點部署,通過競争資料庫鎖來保證隻有一個節點執行任務 通過zookeeper的注冊與發現,可以動态的添加伺服器。 支援水準擴容 使用Quartz基于資料庫的分布式功能,伺服器超出一定數量會給資料庫造成一定的壓力
任務分片 不支援 支援
管理界面
進階功能 彈性擴容,多種作業模式,失效轉移,運作狀态收集,多線程處理資料,幂等性,容錯處理,spring命名空間支援 彈性擴容,分片廣播,故障轉移,Rolling實時日志,GLUE(支援線上編輯代碼,免釋出),任務進度監控,任務依賴,資料加密,郵件報警,運作報表,國際化
缺點 沒有管理界面,以及不支援任務分片等。不适用于分布式場景 需要引入zookeeper , mesos, 增加系統複雜度, 學習成本較高 排程中心通過擷取 DB鎖來保證叢集中執行任務的唯一性, 如果短任務很多,随着排程中心叢集數量增加,那麼資料庫的鎖競争會比較厲害,性能不好。
任務不能重複執行 資料庫鎖 将任務拆分為n個任務項後,各個伺服器分别執行各自配置設定到的任務項。一旦有新的伺服器加入叢集,或現有伺服器下線,elastic-job将在保留本次任務執行不變的情況下,下次任務開始前觸發任務重分片。 使用Quartz基于資料庫的分布式功能
并行排程 采用任務分片方式實作。将一個任務拆分為n個獨立的任務項,由分布式的伺服器并行執行各自配置設定到的分片項。 排程系統多線程(預設10個線程)觸發排程運作,確定排程精确執行,不被堵塞。
失敗處理政策 彈性擴容縮容在下次作業運作前重分片,但本次作業執行的過程中,下線的伺服器所配置設定的作業将不會重新被配置設定。失效轉移功能可以在本次作業運作中用空閑伺服器抓取孤兒作業分片執行。同樣失效轉移功能也會犧牲部分性能。 排程失敗時的處理政策,政策包括:失敗告警(預設)、失敗重試(界面可配置)
動态分片政策 支援多種分片政策,可自定義分片政策。 預設包含三種分片政策: 基于平均配置設定算法的分片政策、 作業名的哈希值奇偶數決定IP升降序算法的分片政策、根據作業名的哈希值對Job執行個體清單進行輪轉的分片政策,支援自定義分片政策。elastic-job的分片是通過zookeeper來實作的。分片的分片由主節點配置設定,如下三種情況都會觸發主節點上的分片算法執行:a、新的Job執行個體加入叢集b、現有的Job執行個體下線(如果下線的是leader節點,那麼先選舉然後觸發分片算法的執行)c、主節點選舉" 分片廣播任務以執行器為次元進行分片,支援動态擴容執行器叢集進而動态增加分片數量,協同進行業務處理;在進行大資料量業務操作時可顯著提升任務處理能力和速度。 執行器叢集部署時,任務路由政策選擇"分片廣播"情況下,一次任務排程将會廣播觸發對應叢集中所有執行器執行一次任務,同時傳遞分片參數;可根據分片參數開發分片任務;

  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>quartz\</mark\>
    • 調用API的的方式操作任務,不人性化;
    • 需要持久化業務QuartzJobBean到底層資料表中,系統侵入性相當嚴重。
    • 排程邏輯和QuartzJobBean耦合在同一個項目中,這将導緻一個問題,在排程任務數量逐漸增多,同時排程任務邏輯逐漸加重的情況加,此時排程系統的性能将大大受限于業務;
    • Quartz關注點在于定時任務而非資料,并無一套根據資料處理而定制化的流程。雖然Quartz可以基于資料庫實作作業的高可用,但缺少分布式并行排程的功能。
  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>xxl-job\</mark\>
    • 側重的業務實作的簡單和管理的友善,學習成本簡單,失敗政策和路由政策豐富。推薦使用在"使用者基數相對少,伺服器數量在一定範圍内"的情景下使用。
  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>elastic-job\</mark\>
    • 關注的是資料,增加了彈性擴容和資料分片的思路,以便于更大限度的利用分布式伺服器的資源。但是學習成本相對高些,推薦在"資料量龐大,且部署伺服器數量較多"時使用。

​ Elastic-Job是一個分布式排程解決方案,由兩個互相獨立的子項目Elastic-Job-Lite和Elastic-Job-Cloud組成。

​ Elastic-Job-Lite定位為輕量級無中心化解決方案,使用jar包的形式提供分布式任務的協調服務。

java定時任務架構quartz、elastic-job和xxl-job的分析對比(個人總結)定時任務架構quartz、elastic-job和xxl-job分析

在這裡插入圖檔描述

java定時任務架構quartz、elastic-job和xxl-job的分析對比(個人總結)定時任務架構quartz、elastic-job和xxl-job分析

java定時任務架構quartz、elastic-job和xxl-job的分析對比(個人總結)定時任務架構quartz、elastic-job和xxl-job分析

  • 分布式排程協調
  • 彈性擴容縮容
  • 失效轉移
  • 錯過執行作業重觸發
  • 作業分片一緻性,保證同一分片在分布式環境中僅一個執行執行個體
  • 自診斷并修複分布式不穩定造成的問題
  • 支援并行排程
  • 支援作業生命周期操作
  • 豐富的作業類型
  • Spring整合以及命名空間提供
  • 運維平台

  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>分片概念\</mark\>

​ 任務的分布式執行,需要将一個任務拆分為多個獨立的任務項,然後由分布式的伺服器分别執行某一個或幾個分片項。

​ 例如:有一個周遊資料庫某張表的作業,現有2台伺服器。為了快速的執行作業,那麼每台伺服器應執行作業的50%。 為滿足此需求,可将作業分成2片,每台伺服器執行1片。作業周遊資料的邏輯應為:伺服器A周遊ID以奇數結尾的資料;伺服器B周遊ID以偶數結尾的資料。 如果分成10片,則作業周遊資料的邏輯應為:每片分到的分片項應為ID%10,而伺服器A被配置設定到分片項0,1,2,3,4;伺服器B被配置設定到分片項5,6,7,8,9,直接的結果就是伺服器A周遊ID以0-4結尾的資料;伺服器B周遊ID以5-9結尾的資料。

\<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>elastic-job 分片政策!!\</mark\>

shardingTotalCount:作業分片總數。

jobShardingStrategyClass:作業分片政策實作類全路徑,elasticJob提供了如下三種分片政策,

  • AverageAllocationJobShardingStrategy :(預設的分片政策) 基于平均配置設定算法的分片政策。
如果有3台伺服器, 分成9片, 則每台伺服器分到的分片是: 1=[0,1,2], 2=[3,4,5], 3=[6,7,8].
如果有3台伺服器, 分成8片, 則每台伺服器分到的分片是: 1=[0,1,6], 2=[2,3,7], 3=[4,5].
如果有3台伺服器, 分成10片, 則每台伺服器分到的分片是: 1=[0,1,2,9], 2=[3,4,5], 3=[6,7,8]
           
  • OdevitySortByNameJobShardingStrategy:根據作業名的哈希值奇偶數決定IP升降序算法的分片政策。
作業名的哈希值為奇數則IP升序.
作業名的哈希值為偶數則IP降序.
用于不同的作業平均配置設定負載至不同的伺服器.
如:
  1\. 如果有3台伺服器, 分成2片, 作業名稱的哈希值為奇數, 則每台伺服器分到的分片是: 1=[0], 2=[1], 3=[].
  2\. 如果有3台伺服器, 分成2片, 作業名稱的哈希值為偶數, 則每台伺服器分到的分片是: 3=[0], 2=[1], 1=[].
           
  • RotateServerByNameJobShardingStrategy:根據作業名的哈希值對伺服器清單進行輪轉的分片政策。

    預設使用AverageAllocationJobShardingStrategy。

shardingItemParameters :分片序列号和個性化參數對照表。

分片序列号和參數用等号分隔, 多個鍵值對用逗号分隔。

分片序列号從0開始, 不可大于或等于作業分片總數。

分片的次元通常有狀态(state)、類型(accountType)、id分區等,需要按照業務合适選取。

  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>分片項與業務處了解耦\</mark\>

​ Elastic-Job并不直接提供資料處理的功能,架構隻會将分片項配置設定至各個運作中的作業伺服器,開發者需要自行處理分片項與真實資料的對應關系。

  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>個性化參數的适用場景\</mark\>

​ 個性化參數即shardingItemParameter,可以和分片項比對對應關系,用于将分片項的數字轉換為更加可讀的業務代碼。

​ 例如:按照地區水準拆分資料庫,資料庫A是北京的資料;資料庫B是上海的資料;資料庫C是廣州的資料。 如果僅按照分片項配置,開發者需要了解0表示北京;1表示上海;2表示廣州。 合理使用個性化參數可以讓代碼更可讀,如果配置為0=北京,1=上海,2=廣州,那麼代碼中直接使用北京,上海,廣州的枚舉值即可完成分片項和業務邏輯的對應關系。

  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>分布式排程\</mark\>

​ Elastic-Job-Lite并無作業排程中心節點,而是基于部署作業架構的程式在到達相應時間點時各自觸發排程。

注冊中心僅用于作業注冊和監控資訊存儲。而主作業節點僅用于處理分片和清理等功能。

  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>作業高可用\</mark\>

​ Elastic-Job-Lite提供最安全的方式執行作業。将分片總數設定為1,并使用多于1台的伺服器執行作業,作業将會以1主n從的方式執行。

  • \<mark style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); overflow-wrap: break-word;"\>最大限度利用資源\</mark\>
IT
上一篇: API安全

繼續閱讀