只會用 xxl-job?一款更強大、新一代分布式任務(wù)調(diào)度框架來了!
程序員的成長之路互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
關(guān)注
閱讀本文大概需要 7?分鐘。
來自:blog.csdn.net/LY_624/article/details/106987036
- 概述
- 為什么選擇PowerJob?
- 同類產(chǎn)品對比
- 適用場景
- 整體架構(gòu)
- 快速開始
- 初始化項目
- 啟動調(diào)度服務(wù)器
- 編寫示例代碼
- 任務(wù)的配置與運行
- 相關(guān)鏈接
概述
PowerJob是新一代分布式任務(wù)調(diào)度與計算框架,支持CRON、API、固定頻率、固定延遲等調(diào)度策略,提供工作流來編排任務(wù)解決依賴關(guān)系,能讓您輕松完成作業(yè)的調(diào)度與繁雜任務(wù)的分布式計算。為什么選擇PowerJob?
當(dāng)前市面上流行的作業(yè)調(diào)度框架有老牌的Quartz、基于Quartz的elastic-job和原先基于Quartz后面移除依賴的xxl-job,這里分別談一些這些框架現(xiàn)存的缺點。Quartz可以視為第一代任務(wù)調(diào)度框架,基本上是現(xiàn)有所有分布式調(diào)度框架的“祖宗”。由于歷史原因,它不提供Web界面,只能通過API完成任務(wù)的配置,使用起來不夠方便和靈活,同時它僅支持單機執(zhí)行,無法有效利用整個集群的計算能力。xxl-job可以視為第二代任務(wù)調(diào)度框架,在一定程度上解決了Quartz的不足,在過去幾年中是個非常優(yōu)秀的調(diào)度框架,不過放到今天來看,還是存在著一些不足的,具體如下:- 數(shù)據(jù)庫支持單一:?僅支持MySQL,使用其他DB需要自己魔改代碼
- 有限的分布式計算能力:?僅支持靜態(tài)分片,無法很好的完成復(fù)雜任務(wù)的計算
- 不支持工作流:?無法配置各個任務(wù)之間的依賴關(guān)系,不適用于有DAG需求的場景
- 使用簡單:?提供前端Web界面,允許開發(fā)者可視化地完成調(diào)度任務(wù)的管理(增、刪、改、查)、任務(wù)運行狀態(tài)監(jiān)控和運行日志查看等功能。
- 定時策略完善:?支持CRON表達式、固定頻率、固定延遲和API四種定時調(diào)度策略。
- 執(zhí)行模式豐富:?支持單機、廣播、Map、MapReduce四種執(zhí)行模式,其中Map/MapReduce處理器能使開發(fā)者寥寥數(shù)行代碼便獲得集群分布式計算的能力。
- DAG工作流支持:?支持在線配置任務(wù)依賴關(guān)系,可視化得對任務(wù)進行編排,同時還支持上下游任務(wù)間的數(shù)據(jù)傳遞
- 執(zhí)行器支持廣泛:?支持Spring Bean、內(nèi)置/外置Java類、Shell、Python等處理器,應(yīng)用范圍廣。
- 運維便捷:?支持在線日志功能,執(zhí)行器產(chǎn)生的日志可以在前端控制臺頁面實時顯示,降低debug成本,極大地提高開發(fā)效率。
- 依賴精簡:?最小僅依賴關(guān)系型數(shù)據(jù)庫(MySQL/PostgreSQL/Oracle/MS SQLServer…),同時支持所有Spring Data JPA所支持的關(guān)系型數(shù)據(jù)庫。
- 高可用&高性能:?調(diào)度服務(wù)器經(jīng)過精心設(shè)計,一改其他調(diào)度框架基于數(shù)據(jù)庫鎖的策略,實現(xiàn)了無鎖化調(diào)度。部署多個調(diào)度服務(wù)器可以同時實現(xiàn)高可用和性能的提升(支持無限的水平擴展)。
- 故障轉(zhuǎn)移與恢復(fù):?任務(wù)執(zhí)行失敗后,可根據(jù)配置的重試策略完成重試,只要執(zhí)行器集群有足夠的計算節(jié)點,任務(wù)就能順利完成。
同類產(chǎn)品對比
|
|
QuartZ | xxl-job | SchedulerX 2.0 | PowerJob |
|---|---|---|---|---|
| 定時類型 | CRON | CRON | CRON、固定頻率、固定延遲、OpenAPI | CRON、固定頻率、固定延遲、OpenAPI |
| 任務(wù)類型 | 內(nèi)置Java | 內(nèi)置Java、GLUE Java、Shell、Python等腳本 | 內(nèi)置Java、外置Java(FatJar)、Shell、Python等腳本 | 內(nèi)置Java、外置Java(容器)、Shell、Python等腳本 |
| 分布式任務(wù) | 無 | 靜態(tài)分片 | MapReduce動態(tài)分片 | MapReduce動態(tài)分片 |
| 在線任務(wù)治理 | 不支持 | 支持 | 支持 | 支持 |
| 日志白屏化 | 不支持 | 支持 | 不支持 | 支持 |
| 調(diào)度方式及性能 | 基于數(shù)據(jù)庫鎖,有性能瓶頸 | 基于數(shù)據(jù)庫鎖,有性能瓶頸 | 不詳 | 無鎖化設(shè)計,性能強勁無上限 |
| 報警監(jiān)控 | 無 | 郵件 | 短信 | 郵件,提供接口允許開發(fā)者擴展 |
| 系統(tǒng)依賴 | JDBC支持的關(guān)系型數(shù)據(jù)庫(MySQL、Oracle…) | MySQL | 人民幣(公測期間免費,哎,幫打個廣告吧) | 任意Spring Data Jpa支持的關(guān)系型數(shù)據(jù)庫(MySQL、Oracle…) |
| DAG工作流 | 不支持 | 不支持 | 支持 | 支持 |
適用場景
有定時執(zhí)行需求的業(yè)務(wù)場景:如每天凌晨全量同步數(shù)據(jù)、生成業(yè)務(wù)報表等。有需要全部機器一同執(zhí)行的業(yè)務(wù)場景:如使用廣播執(zhí)行模式清理集群日志。有需要分布式處理的業(yè)務(wù)場景:比如需要更新一大批數(shù)據(jù),單機執(zhí)行耗時非常長,可以使用Map/MapReduce處理器完成任務(wù)的分發(fā),調(diào)動整個集群加速計算。整體架構(gòu)
圖片快速開始
PowerJob由調(diào)度服務(wù)器(powerjob-server)和執(zhí)行器(powerjob-worker)兩部分組成,powerjob-server負責(zé)提供Web服務(wù)和完成任務(wù)的調(diào)度,powerjob-worker則負責(zé)執(zhí)行用戶所編寫的任務(wù)代碼,同時提供分布式計算能力。初始化項目
git?clone?https://github.com/KFCFans/PowerJob.git
圖片啟動調(diào)度服務(wù)器
創(chuàng)建數(shù)據(jù)庫 powerjob-daily修改配置文件,配置文件的說明官方文檔寫的非常詳細,此處不再贅述。需要修改的地方為數(shù)據(jù)庫配置spring.datasource.core.jdbc-url、spring.datasource.core.username和spring.datasource.core.password,當(dāng)然,有mongoDB的同學(xué)也可以修改spring.data.mongodb.uri以獲取完全版體驗。
oms.env=DAILY
logging.config=classpath:logback-dev.xml
######?數(shù)據(jù)庫配置?#######
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啟動調(diào)度服務(wù)器,觀察啟動日志,查看是否啟動成功~啟動成功后,訪問?http://127.0.0.1:7700/?,如果能順利出現(xiàn)Web界面,則說明調(diào)度服務(wù)器啟動成功!注冊應(yīng)用:點擊主頁應(yīng)用注冊按鈕,填入 oms-test和控制臺密碼(用于進入控制臺),注冊示例應(yīng)用(當(dāng)然你也可以注冊其他的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?{
????????//?服務(wù)器HTTP地址(端口號為?server.port,而不是?ActorSystem?port)
????????List<String>?serverAddress?=?Lists.newArrayList("127.0.0.1:7700");
????????//?1.?創(chuàng)建配置文件
????????OhMyConfig?config?=?new?OhMyConfig();
????????config.setPort(27777);
????????config.setAppName("oms-test");
????????config.setServerAddress(serverAddress);
????????//?如果沒有大型?Map/MapReduce?的需求,建議使用內(nèi)存來加速計算
????????config.setStoreStrategy(StoreStrategy.MEMORY);
????????//?2.?創(chuàng)建?Worker?對象,設(shè)置配置文件
????????OhMyWorker?ohMyWorker?=?new?OhMyWorker();
????????ohMyWorker.setConfig(config);
????????return?ohMyWorker;
????}
}
@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,觀察控制臺輸出信息,判斷是否啟動成功。任務(wù)的配置與運行
調(diào)度服務(wù)器與示例工程都啟動完畢后,再次前往Web頁面(?http://127.0.0.1:7700/?),進行任務(wù)的配置與運行。在首頁輸入框輸入配置的應(yīng)用名稱,成功操作后會正式進入前端管理界面。
圖片點擊任務(wù)管理 -> 新建任務(wù)(右上角),開始創(chuàng)建任務(wù)。
圖片完成任務(wù)創(chuàng)建后,即可在控制臺看到剛才創(chuàng)建的任務(wù),如果覺得等待調(diào)度太過于漫長,可以直接點擊運行按鈕,立即運行本任務(wù)。
圖片前往任務(wù)示例邊欄,查看任務(wù)的運行狀態(tài)和在線日志
圖片基礎(chǔ)的教程到這里也就結(jié)束了~更多功能示例可見官方文檔,工作流、MapReduce、容器等高級特性等你來探索!相關(guān)鏈接
項目地址:- https://github.com/KFCFans/PowerJob
- https://www.yuque.com/powerjob/guidence/ztn4i5
- https://www.yuque.com/powerjob/guidence/hnbskn
推薦閱讀:
終于搞懂了 @Configuration 和 @Component 的區(qū)別 !
熱議:ChatGPT 的出現(xiàn)會不會導(dǎo)致底層程序員失業(yè)?
互聯(lián)網(wǎng)初中高級大廠面試題(9個G)
內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)??!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?
![]()
