【PowerJob】值得你擁有的新一代分佈式任務調度與計算框架

概述

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處理器完成任務的分發,調動整個集羣加速計算。

整體架構

arch

相關鏈接

項目地址:GitHub

官方文檔:文檔

在線試用:試用

快速開始

PowerJob由調度服務器(powerjob-server)和執行器(powerjob-worker)兩部分組成,powerjob-server負責提供Web服務和完成任務的調度,powerjob-worker則負責執行用戶所編寫的任務代碼,同時提供分佈式計算能力。

初始化項目

  1. git clone https://github.com/KFCFans/PowerJob.git
  2. 導入 IDE,源碼結構如下,我們需要啓動調度服務器(powerjob-server),同時在samples工程中編寫自己的處理器代碼

image.png

啓動調度服務器

  1. 創建數據庫 powerjob-daily
  2. 修改配置文件,配置文件的說明官方文檔寫的非常詳細,此處不再贅述。需要修改的地方爲數據庫配置spring.datasource.core.jdbc-urlspring.datasource.core.usernamespring.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
  1. 完成配置文件的修改後,可以直接通過啓動類com.github.kfcfans.powerjob.server.OhMyApplication啓動調度服務器,觀察啓動日誌,查看是否啓動成功~啓動成功後,訪問 http://127.0.0.1:7700/ ,如果能順利出現Web界面,則說明調度服務器啓動成功!
  2. 註冊應用:點擊主頁應用註冊按鈕,填入 oms-test和控制檯密碼(用於進入控制檯),註冊示例應用(當然你也可以註冊其他的appName,只是別忘記在示例程序中同步修改~)

image.png

編寫示例代碼

進入示例工程(powerjob-worker-samples),修改配置文件連接powerjob-server並編寫自己的處理器代碼。

  1. 修改powerjob-worker-samples的啓動配置類com.github.kfcfans.powerjob.samples.OhMySchedulerConfigAppName修改爲剛剛在控制檯註冊的名稱
@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;
    }
}
  1. 編寫自己的處理器:隨便找個地方新建類,繼承你想要使用的處理器(各個處理器的介紹可見官方文檔,文檔非常詳細),這裏爲了簡單演示,選擇使用單機處理器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~");
    }
}
  1. 啓動示例程序,即直接運行主類com.github.kfcfans.powerjob.samples.SampleApplication,觀察控制檯輸出信息,判斷是否啓動成功。

任務的配置與運行

調度服務器與示例工程都啓動完畢後,再次前往Web頁面( http://127.0.0.1:7700/ ),進行任務的配置與運行。

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

image.png

  1. 點擊任務管理 -> 新建任務(右上角),開始創建任務。

img

  1. 完成任務創建後,即可在控制檯看到剛纔創建的任務,如果覺得等待調度太過於漫長,可以直接點擊運行按鈕,立即運行本任務。

image.png

  1. 前往任務示例邊欄,查看任務的運行狀態和在線日誌

image.png

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章