只會用 xxl-job?更強大的分散式任務排程框架來了!

語言: CN / TW / HK

本文已經收錄到Github倉庫,該倉庫包含計算機基礎、Java基礎、多執行緒、JVM、常見框架、分散式、微服務、設計模式、架構等核心知識點,歡迎star~

地址:http://github.com/Tyson0314/Java-learning

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所支援的關係型資料庫。
  • 高可用&高效能: 排程伺服器經過精心設計,一改其他排程框架基於資料庫鎖的策略,實現了無鎖化排程。部署多個排程伺服器可以同時實現高可用和效能的提升(支援無限的水平擴充套件)。
  • 故障轉移與恢復: 任務執行失敗後,可根據配置的重試策略完成重試,只要執行器叢集有足夠的計算節點,任務就能順利完成。

同類產品對比

適用場景

  • 有定時執行需求的業務場景:如每天凌晨全量同步資料、生成業務報表等。
  • 有需要全部機器一同執行的業務場景:如使用廣播執行模式清理叢集日誌。
  • 有需要分散式處理的業務場景:比如需要更新一大批資料,單機執行耗時非常長,可以使用Map/MapReduce處理器完成任務的分發,調動整個叢集加速計算。

整體架構

相關連結

快速開始

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

初始化專案

1、 gitclonehttp://github.com/KFCFans/PowerJob.git

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

啟動排程伺服器

1、 建立資料庫powerjob-daily;

2、 修改配置檔案,配置檔案的說明官方文件寫的非常詳細,此處不再贅述需要修改的地方為資料庫配置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 ​ ```

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

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

編寫示例程式碼

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

1、 修改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;   } } ​

2、 編寫自己的處理器:隨便找個地方新建類,繼承你想要使用的處理器(各個處理器的介紹可見官方文件,文件非常詳細),這裡為了簡單演示,選擇使用單機處理器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~");   } } ​

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

任務的配置與執行

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

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

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

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

4、 前往任務示例邊欄,檢視任務的執行狀態和線上日誌;

powerjob7

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

參考連結:blog.csdn.net/LY_624/article/details/106987036