概述
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處理器完成任務的分發,調動整個集羣加速計算。
整體架構
相關鏈接
項目地址:GitHub
官方文檔:文檔
在線試用:試用
快速開始
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、容器等高級特性等你來探索!