點選關註公眾號,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 框架學習、架構師學習等!
文章有幫助的話,在看,轉發吧。
謝謝支持喲 (*^__^*)