天天看點

萬字長文簡單明了的介紹xxl-job以及quartz

作者:阿裡開發者
簡介: 本文主要介紹分布式定時任務架構xxl-job,本文首先會對xxl-job做一個基本的介紹,接着将xxl-job與quartz做一個比較,最後就是介紹xxl-job排程的詳細過程。

前言

本文主要介紹分布式定時任務架構xxl-job,本文首先會對xxl-job做一個基本的介紹,接着将xxl-job與quartz做一個比較,最後就是介紹xxl-job排程的詳細過程。

xxl-job的介紹

xxl-job是一個開源的分布式定時任務架構,其排程中心和執行器是互相分離,分開部署的,兩者通過HTTP協定進行通信。其架構如下圖所示:

萬字長文簡單明了的介紹xxl-job以及quartz

排程中心:

負責管理排程資訊,按照排程配置發出排程請求,自身不承擔業務代碼。排程系統與任務解耦,提高了系統可用性和穩定性,同時排程系統性能不再受限于任務子產品;

支援可視化、簡單且動态的管理排程資訊,包括任務建立,更新,删除,GLUE開發和任務報警等,所有上述操作都會實時生效,同時支援監控排程結果以及執行日志,支援執行器Failover,支援建立執行器等功能。

執行子產品(執行器):

負責接收排程請求并執行任務邏輯。任務子產品專注于任務的執行等操作,開發和維護更加簡單和高效;接收“排程中心”的執行請求、終止請求和日志請求等。

特性

xxl-job的特性有很多,官網上有詳細的介紹,這裡我會介紹幾個重要的特性:

1.簡單:支援通過Web頁面對任務進行CRUD操作,操作簡單,一分鐘上手;

2.動态:支援動态修改任務狀态、啟動/停止任務,以及終止運作中的任務,都是即時生效的。

3.排程中心HA(中心式):排程采用中心式設計,“排程中心”自研排程元件并支援叢集部署,可保證排程中心HA;

4.執行器HA(分布式):任務分布式執行,任務”執行器”支援叢集部署,可保證任務執行HA;

5.排程過期政策:排程中心錯過排程時間的補償處理政策:包括:忽略,立即補償觸發一次等;

6.阻塞處理政策:排程過于密集執行器來不及處理時的處理政策,政策包括:單機串行(預設)、丢棄後續排程、覆寫之前的調用。

7.任務逾時控制:支援自定義任務逾時時間,任務運作逾時将會主動中斷任務;

xxl-job相關的資料表

xxl-job将任務資訊以及日志資訊持久化到資料表中,這個就保證了可以動态的添加删除任務。

1.xxl_job_lock:任務排程鎖表,線上程查詢任務資訊時會調用上鎖。

2.xxl_job_group:執行器資訊表,維護任務執行器資訊;

3.xxl_job_info:排程擴充資訊表: 用于儲存XXL-JOB排程任務的擴充資訊,如任務分組、任務名、機器位址、執行器、執行入參和報警郵件等等;

4.xxl_job_log:排程日志表: 用于儲存XXL-JOB任務排程的曆史資訊,如排程結果、執行結果、排程入參、排程機器和執行器等等;

5.xxl_job_log_report:排程日志報表:使用者存儲XXL-JOB任務排程日志的報表,排程中心報表功能頁面會用到;

6.xxl_job_logglue:任務GLUE日志:用于儲存GLUE更新曆史,用于支援GLUE的版本回溯功能;

7.xxl_job_registry:執行器系統資料庫,維護線上的執行器和排程中心機器位址資訊;

8.xxl_job_user:系統使用者表;

xxl-job與quartz的異同

這一部分主要是将quartz和xxl-job做一個比較,quartz是一款開源的使用非常廣泛的定時任務架構。其可以說是定時任務的鼻祖,很多理念都與xxl-job類似。

綜合比較

萬字長文簡單明了的介紹xxl-job以及quartz

整體來說,xxl-job就是quartz的一個增強版,其彌補了quartz不支援并行排程,不支援失敗處理政策和動态分片的政策等諸多不足,同時其有管理界面,上手比較容易,支援分布式,适用于分布式場景下的使用。兩者相同的是都是通過資料庫鎖來控制任務不能重複執行。

核心類比較

類名 作用
QuartzSchedulerThread 負責執行向QuartzScheduler注冊的觸發Trigger的工作的線程
ThreadPool Scheduler使用一個線程池作為任務運作的基礎設施,任務通過共享線程池中的線程提供運作效率
QuartzSchedulerResources 包含建立QuartzScheduler執行個體所需的所有資源(JobStore,ThreadPool等)
SchedulerFactory 生成Scheduler執行個體
JobStore 通過類實作的接口,這些類要為org.quartz.core.QuartzScheduler的使用提供一個org.quartz.Job和org.quartz.Trigger存儲機制。作業和觸發器的存儲應該以其名稱群組的組合為唯一性。
QuartzScheduler 這是Quartz的核心,它是org.quartz.Scheduler接口的間接實作,包含排程org.quartz.Jobs,注冊org.quartz.JobListener執行個體等的方法。
Scheduler 代表一個排程容器,一個排程容器中可以注冊多個JobDetail和Trigger。當Trigger與JobDetail組合,就可以被Scheduler容器排程了。
Trigger 具有所有觸發器通用屬性的基本接口,描述了job執行的時間出發規則,使用TriggerBuilder執行個體化實際觸發器,即表示什麼時候去調用任務
JobDetail 表示一個具體的可執行的排程程式,Job是這個可執行的排程程式所要執行的内容,另外JobDetail還包含了這個任務排程的方案和政策
Job 表示一個工作,即要執行的具體内容

quartz中的類有很多,我們關注并掌握好Schedule(排程容器),Trigger(觸發器),JobDetail&Job(定義具體的執行任務)這幾個類就掌握了quartz的核心了。因為其餘的類都是圍繞這幾個類轉的,下圖展示了各個核心類的調用關系:

萬字長文簡單明了的介紹xxl-job以及quartz

quartz的調用示例:

public class RAMQuartz {
    public static void main(String[] args) throws SchedulerException {
   //1.建立Scheduler的工廠
        SchedulerFactory sf = new StdSchedulerFactory();
        //2.從工廠中擷取排程器執行個體
        Scheduler scheduler = sf.getScheduler();
        //3.建立JobDetail
        JobDetail jobDetail = JobBuilder.newJob(RAMJob.class).withDescription("this is a ram job")
                .withIdentity("ramJob", "ramGroup").build();   //job的name和group
        // 4.任務運作的時間,SimpleScheduler類型觸發器有效,3秒後啟動
        long time = System.currentTimeMillis() + 3 * 1000L;
        Date startTime = new Date(time);
        // 5.建立Trigger
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withDescription("")
                .withIdentity("ramTrigger", "ramTriggerGroup")
                .startAt(startTime).withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) //每10秒跑一次
                .build();
        // 6.注冊任務和定時器
        scheduler.scheduleJob(jobDetail, cronTrigger);
        // 7.啟動排程器
        scheduler.start();
        System.out.println("啟動時間: " + new Date());
 }           

點選檢視原文,擷取更多福利!

https://developer.aliyun.com/article/1149981?utm_content=g_1000367811

版權聲明:本文内容由阿裡雲實名注冊使用者自發貢獻,版權歸原作者所有,阿裡雲開發者社群不擁有其著作權,亦不承擔相應法律責任。具體規則請檢視《阿裡雲開發者社群使用者服務協定》和《阿裡雲開發者社群知識産權保護指引》。如果您發現本社群中有涉嫌抄襲的内容,填寫侵權投訴表單進行舉報,一經查實,本社群将立刻删除涉嫌侵權内容。

繼續閱讀