當前位置: 妍妍網 > 碼農

只會用 xxl-job?一款更強大、新一代分布式任務排程框架來了!

2024-05-21碼農

點選關註公眾號,Java幹貨 及時送達 👇

來源:blog.csdn.net/LY_624/ article/details/106987036

概述

PowerJob是新一代分布式任務排程與計算框架,支持CRON、API、固定頻率、固定延遲等排程策略,提供工作流來編排任務解決依賴關系,能讓您輕松完成作業的排程與繁雜任務的分布式計算。

為什麽選擇PowerJob?

當前市面上流行的作業排程框架有老牌的Quartz、基於Quartz的elastic-job和原先基於Quartz後面移除依賴的xxl-job,這裏分別談一些這些框架現存的缺點。

Quartz可以視為第一代任務排程框架,基本上是現有所有分布式排程框架的「祖宗」。由於歷史原因,它不提供Web界面,只能透過API完成任務的配置,使用起來不夠方便和靈活,同時它僅支持單機執行,無法有效利用整個集群的計算能力。

xxl-job可以視為第二代任務排程框架,在一定程度上解決了Quartz的不足,在過去幾年中是個非常優秀的排程框架,不過放到今天來看,還是存在著一些不足的,具體如下:

  • 資料庫支持單一: 僅支持MySQL,使用其他DB需要自己魔改程式碼

  • 有限的分布式計算能力: 僅支持靜態分片,無法很好的完成復雜任務的計算

  • 不支持工作流: 無法配置各個任務之間的依賴關系,不適用於有DAG需求的場景

  • 正所謂長江後浪推前浪,在如今這個數據量日益增長、業務越來越復雜的年代,急需一款更為強大的任務排程框架來解決上訴問題,而PowerJob因此應運而生。

    PowerJob可以被認為是第三代任務排程框架,在任務排程的基礎上,還額外提供了分布式計算和工作流功能,其主要特性如下:

  • 使用簡單: 提供前端Web界面,允許開發者視覺化地完成排程任務的管理(增、刪、改、查)、任務執行狀態監控和執行日誌檢視等功能。

  • 定時策略完善: 支持CRON運算式、固定頻率、固定延遲和API四種定時排程策略。

  • 執行模式豐富: 支持單機、廣播、Map、MapReduce四種執行模式,其中Map/MapReduce處理器能使開發者寥寥數行程式碼便獲得集群分布式計算的能力。

  • DAG工作流支持: 支持線上配置任務依賴關系,視覺化得對任務進行編排,同時還支持上下遊任務間的數據傳遞

  • 執行器支持廣泛: 支持Spring Bean、內建/外接Java類、Shell、Python等處理器,套用範圍廣。

  • 運維便捷: 支持線上日誌功能,執行器產生的日誌可以在前端控制台頁面即時顯示,降低debug成本,極大地提高開發效率。

  • 依賴精簡: 最小僅依賴關系型資料庫(MySQL/PostgreSQL/Oracle/MS SQLServer…),同時支持所有Spring Data JPA所支持的關系型資料庫。

  • 高可用&高效能: 排程伺服器經過精心設計,一改其他排程框架基於資料庫鎖的策略,實作了無鎖化排程。部署多個排程伺服器可以同時實作高可用和效能的提升(支持無限的水平擴充套件)。

  • 故障轉移與恢復: 任務執行失敗後,可根據配置的重試策略完成重試,只要執行器集群有足夠的計算節點,任務就能順利完成。

  • 同類產品對比

    QuartZ xxl-job SchedulerX 2.0 PowerJob
    定時型別 CRON CRON CRON、固定頻率、固定延遲、OpenAPI CRON、固定頻率、固定延遲、OpenAPI
    任務型別 內建Java 內建Java、GLUE Java、Shell、Python等指令碼 內建Java、外接Java(FatJar)、Shell、Python等指令碼 內建Java、外接Java(容器)、Shell、Python等指令碼
    分布式任務 靜態分片 MapReduce動態分片 MapReduce動態分片
    線上任務治理 不支持 支持 支持 支持
    日誌白屏化 不支持 支持 不支持 支持
    排程方式及效能 基於資料庫鎖,有效能瓶頸 基於資料庫鎖,有效能瓶頸 不詳 無鎖化設計,效能強勁無上限
    報警監控 信件 簡訊 信件,提供介面允許開發者擴充套件
    系統依賴 JDBC支持的關系型資料庫(MySQL、Oracle…) MySQL 人民幣(公測期間免費,哎,幫打個廣告吧) 任意Spring Data Jpa支持的關系型資料庫(MySQL、Oracle…)
    DAG工作流 不支持 不支持 支持 支持

    適用場景

    有定時執行需求的業務場景:如每天淩晨全量同步數據、生成業務報表等。

    有需要全部機器一同執行的業務場景:如使用廣播執行模式清理集群日誌。

    有需要分布式處理的業務場景:比如需要更新一大批數據,單機執行耗時非常長,可以使用Map/MapReduce處理器完成任務的分發,調動整個集群加速計算。

    整體架構

    圖片

    快速開始

    PowerJob由排程伺服器(powerjob-server)和執行器(powerjob-worker)兩部份組成,powerjob-server負責提供Web服務和完成任務的排程,powerjob-worker則負責執行使用者所編寫的任務程式碼,同時提供分布式計算能力。

    初始化計畫

    git clone https://github.com/KFCFans/PowerJob.git

    匯入 IDE,源碼結構如下,我們需要啟動排程伺服器(powerjob-server),同時在samples工程中編寫自己的處理器程式碼

    圖片

    啟動排程伺服器

    建立資料庫 powerjob-daily

    修改配置檔,配置檔的說明官方文件寫的非常詳細,此處不再贅述。需要修改的地方為資料庫配置 spring.datasource.core.jdbc-url spring.datasource.core.username spring.datasource.core.password ,當然,有mongoDB的同學也可以修改 spring.data.mongodb.uri 以獲取完全版體驗。

    oms.env=DAILY
    logging.config= classpath:logback-dev.xml
    ###### 資料庫配置 #######
    spring.datasource.core.driver- class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.core.jdbc-url=jdbc:mysql://remotehost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8
    spring.datasource.core.username=root
    spring.datasource.core.password=No1Bug2Please3!
    spring.datasource.core.hikari.maximum-pool-size=20
    spring.datasource.core.hikari.minimum-idle=5
    ###### mongoDB配置,非核心依賴,可移除 #######
    spring.data.mongodb.uri=mongodb://remotehost:27017/powerjob-daily
    ###### 信件配置(啟用信件報警則需要) #######
    spring.mail.host=smtp.163.com
    spring.mail.username=zqq
    spring.mail.password=qqz
    spring.mail.properties.mail.smtp.auth=true
    spring.mail.properties.mail.smtp.starttls.enable=true
    spring.mail.properties.mail.smtp.starttls.required=true
    ###### 資源清理配置 #######
    oms.log.retention.local=1
    oms.log.retention.remote=1
    oms.container.retention.local=1
    oms.container.retention.remote=-1
    oms.instanceinfo.retention=1
    ###### 緩存配置 #######
    oms.instance.metadata.cache.size=1024



    完成配置檔的修改後,可以直接透過啟動類 com.github.kfcfans.powerjob.server.OhMyApplication 啟動排程伺服器,觀察啟動日誌,檢視是否啟動成功~啟動成功後,存取 http://127.0.0.1:7700/ ,如果能順利出現Web界面,則說明排程伺服器啟動成功!

    註冊套用:點選主頁套用註冊按鈕,填入 oms-test和控制台密碼(用於進入控制台),註冊範例套用(當然你也可以註冊其他的appName,只是別忘記在範例程式中同步修改~)

    圖片

    編寫範例程式碼

    進入範例工程(powerjob-worker-samples),修改配置檔連線powerjob-server並編寫自己的處理器程式碼。

    修改powerjob-worker-samples的啟動配置類 com.github.kfcfans.powerjob.samples.OhMySchedulerConfig ,將AppName修改為剛剛在控制台註冊的名稱。

    @Configuration
    public class OhMySchedulerConfig {
    @Bean
    public OhMyWorker initOMS() throws Exception {
    // 伺服器HTTP地址(埠號為 server.port,而不是 ActorSystem port)
    List<String> serverAddress = Lists.newArrayList("127.0.0.1:7700");
    // 1. 建立配置檔
    OhMyConfig config = new OhMyConfig();
    config.setPort(27777);
    config.setAppName("oms-test");
    config.setServerAddress(serverAddress);
    // 如果沒有大型 Map/MapReduce 的需求,建議使用記憶體來加速計算
    config.setStoreStrategy(StoreStrategy.MEMORY);
    // 2. 建立 Worker 物件,設定配置檔
    OhMyWorker ohMyWorker = new OhMyWorker();
    ohMyWorker.setConfig(config);
    return ohMyWorker;
    }
    }

    編寫自己的處理器:隨便找個地方新建類,繼承你想要使用的處理器(各個處理器的介紹可見官方文件,文件非常詳細),這裏為了簡單演示,選擇使用單機處理器BasicProcessor,以下是程式碼範例。

    @Slf4j
    @Component
    public class StandaloneProcessorDemo implements BasicProcessor {
    @Override
    public ProcessResult process(TaskContext context) throws Exception {
    OmsLogger omsLogger = context.getOmsLogger();
    omsLogger.info("StandaloneProcessorDemo start process,context is {}.", context);
    System.out.println("jobParams is " + context.getJobParams());
    return new ProcessResult(true"process successfully~");
    }
    }

    啟動範例程式,即直接執行主類 com.github.kfcfans.powerjob.samples.SampleApplication ,觀察控制台輸出資訊,判斷是否啟動成功。

    任務的配置與執行

    排程伺服器與範例工程都啟動完畢後,再次前往Web頁面( http://127.0.0.1:7700/ ),進行任務的配置與執行。

    在首頁輸入框輸入配置的套用名稱,成功操作後會正式進入前端管理界面。

    圖片

    點選任務管理 -> 新建任務(右上角),開始建立任務。

    圖片

    完成任務建立後,即可在控制台看到剛才建立的任務,如果覺得等待排程太過於漫長,可以直接點選執行按鈕,立即執行本任務。

    圖片

    前往任務範例資訊看板,檢視任務的執行狀態和線上日誌

    圖片

    基礎的教程到這裏也就結束了~更多功能範例可見官方文件,工作流、MapReduce、容器等高級特性等你來探索!

    相關連結

    計畫地址:

  • https://github.com/KFCFans/PowerJob

  • 官方文件:

  • https://www.yuque.com/powerjob/guidence/ztn4i5

  • 線上試用:

  • https://www.yuque.com/powerjob/guidence/hnbskn

  • END


    看完本文有收獲?請轉發分享給更多人

    關註「Java編程鴨」,提升Java技能

    關註Java編程鴨微信公眾號,後台回復:碼農大禮包可以獲取最新整理的技術資料一份。涵蓋Java 框架學習、架構師學習等

    文章有幫助的話,在看,轉發吧。

    謝謝支持喲 (*^__^*)