概述
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則負責執行用戶所撰寫的任務代碼,同時提供分布式計算能力,
初始化專案
Spring Boot 基礎就不介紹了,推薦看這個免費教程:
https://github.com/javastacks/spring-boot-best-practice
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/PowerJob/PowerJob
著作權宣告:本文為CSDN博主「LY_624」的原創文章,遵循CC 4.0 BY-SA著作權協議,轉載請附上原文出處鏈接及本宣告,原文鏈接:https://blog.csdn.net/LY_624/article/details/106987036
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542845.html
標籤:Java
上一篇:Java里面為什么搞了雙重檢查鎖,寫完這篇文章終于真相大白了
下一篇:正則運算式
