概述
OhMyScheduler是新一代分布式調(diào)度與計(jì)算框架氓扛,支持CRON、API采郎、固定頻率、固定延遲等調(diào)度策略蒜埋,提供工作流來編排任務(wù)解決依賴關(guān)系,使用簡單最楷,功能強(qiáng)大待错,文檔齊全烈评,開箱即用!
為什么選擇 OhMyScheduler 讲冠?
當(dāng)前市面上流行的作業(yè)調(diào)度框架有老牌的Quartz瓜客、基于Quartz的elastic-job和原先基于Quartz后面移除依賴的xxl-job沟启,這里分別談一些這些框架現(xiàn)存的缺點(diǎn)忆家。
Quartz可以視為第一代調(diào)度框架,基本上是現(xiàn)有所有分布式調(diào)度框架的“祖宗”德迹。由于歷史原因芽卿,它不提供Web界面,只能通過API完成任務(wù)的配置胳搞,使用起來不夠方便和靈活卸例,同時(shí)它僅支持單機(jī)執(zhí)行,無法有效利用整個(gè)集群的計(jì)算能力肌毅。
xxl-job可以視為第二代調(diào)度框架筷转,在一定程度上解決了Quartz的不足,在過去幾年中是個(gè)非常優(yōu)秀的調(diào)度框架悬而,不過放到今天來看呜舒,還是存在著一些不足的,具體如下:
- 數(shù)據(jù)庫支持單一:僅支持MySQL笨奠,使用其他DB需要自己魔改代碼
- 有限的分布式計(jì)算能力:僅支持靜態(tài)分片袭蝗,無法很好的完成復(fù)雜任務(wù)的計(jì)算
- 不支持工作流:無法配置各個(gè)任務(wù)之間的依賴關(guān)系,不適用于有DAG需求的場景
正所謂長江后浪推前浪般婆,在如今這個(gè)數(shù)據(jù)量日益增長到腥、業(yè)務(wù)越來越復(fù)雜的年代,急需一款更為強(qiáng)大的任務(wù)調(diào)度框架來解決上訴問題蔚袍,而OhMyScheudler就是這個(gè)“救世主”乡范。
我將OhMyScheduler稱為第三代調(diào)度框架,在任務(wù)調(diào)度的基礎(chǔ)上啤咽,額外提供分布式計(jì)算和工作流功能晋辆,其主要特性如下:
- 使用簡單:提供前端Web界面,允許開發(fā)者可視化地完成調(diào)度任務(wù)的管理(增闰蚕、刪栈拖、改、查)没陡、任務(wù)運(yùn)行狀態(tài)監(jiān)控和運(yùn)行日志查看等功能涩哟。
- 定時(shí)策略完善:支持CRON表達(dá)式索赏、固定頻率、固定延遲和API四種定時(shí)調(diào)度策略贴彼。
- 執(zhí)行模式豐富:支持單機(jī)潜腻、廣播、Map器仗、MapReduce四種執(zhí)行模式融涣,其中Map/MapReduce處理器能使開發(fā)者寥寥數(shù)行代碼便獲得集群分布式計(jì)算的能力。
- DAG工作流支持:支持在線配置任務(wù)依賴關(guān)系威鹿,可視化得對任務(wù)進(jìn)行編排,同時(shí)還支持上下游任務(wù)間的數(shù)據(jù)傳遞
- 執(zhí)行器支持廣泛:支持Spring Bean忽你、內(nèi)置/外置Java類臂容、Shell、Python等處理器糟秘,應(yīng)用范圍廣尿赚。
- 運(yùn)維便捷:支持在線日志功能蕉堰,執(zhí)行器產(chǎn)生的日志可以在前端控制臺(tái)頁面實(shí)時(shí)顯示,降低debug成本,極大地提高開發(fā)效率躲舌。
- 依賴精簡:最小僅依賴關(guān)系型數(shù)據(jù)庫(MySQL/PostgreSQL/Oracle/MS SQLServer...),同時(shí)支持所有Spring Data JPA所支持的關(guān)系型數(shù)據(jù)庫羹奉。
- 高可用&高性能:調(diào)度服務(wù)器經(jīng)過精心設(shè)計(jì)约计,一改其他調(diào)度框架基于數(shù)據(jù)庫鎖的策略,實(shí)現(xiàn)了無鎖化調(diào)度耕挨。部署多個(gè)調(diào)度服務(wù)器可以同時(shí)實(shí)現(xiàn)高可用和性能的提升(支持無限的水平擴(kuò)展)。
- 故障轉(zhuǎn)移與恢復(fù):任務(wù)執(zhí)行失敗后筒占,可根據(jù)配置的重試策略完成重試,只要執(zhí)行器集群有足夠的計(jì)算節(jié)點(diǎn)止邮,任務(wù)就能順利完成奏窑。
適用場景
- 有定時(shí)執(zhí)行需求的業(yè)務(wù)場景:如每天凌晨全量同步數(shù)據(jù)、生成業(yè)務(wù)報(bào)表等撩匕。
- 有需要全部機(jī)器一同執(zhí)行的業(yè)務(wù)場景:如使用廣播執(zhí)行模式清理集群日志滑沧。
- 有需要分布式處理的業(yè)務(wù)場景:比如需要更新一大批數(shù)據(jù)巍实,單機(jī)執(zhí)行耗時(shí)非常長,可以使用Map/MapReduce處理器完成任務(wù)的分發(fā)令漂,調(diào)動(dòng)整個(gè)集群加速計(jì)算丸边。
項(xiàng)目地址與文檔
項(xiàng)目地址:https://github.com/KFCFans/OhMyScheduler
官方文檔:https://www.yuque.com/ohmyscheduler/guidence/ztn4i5
快速開始
OhMyScheduler由調(diào)度服務(wù)器(oms-server)和執(zhí)行器(oms-worker)兩部分組成,oms-server負(fù)責(zé)提供Web服務(wù)和完成任務(wù)的調(diào)度纬朝,oms-worker則負(fù)責(zé)執(zhí)行用戶所編寫的任務(wù)代碼骄呼,同時(shí)提供分布式計(jì)算能力。
PS:本文主要面向入門用戶隅茎,因此以下為本地開發(fā)環(huán)境運(yùn)行教程嫉沽,有豐富經(jīng)驗(yàn)的同學(xué)可以直接閱讀官方文檔。
初始化項(xiàng)目
git clone https://github.com/KFCFans/OhMyScheduler.git
- 導(dǎo)入 IDEA堂竟,源碼結(jié)構(gòu)如下,我們需要啟動(dòng)調(diào)度服務(wù)器(oms-server)漱牵,同時(shí)在samples工程中編寫自己的處理器代碼
啟動(dòng)調(diào)度服務(wù)器
- 創(chuàng)建數(shù)據(jù)庫(僅需要?jiǎng)?chuàng)建數(shù)據(jù)庫):找到你的DB酣胀,運(yùn)行SQL
CREATE database if NOT EXISTS oms-daily default character set utf8mb4 collate utf8mb4_unicode_ci
娶聘,搞定~ - 修改配置文件,配置文件的說明官方文檔寫的非常詳細(xì)铆农,此處不再贅述狡耻。必須需要修改的地方有
spring.datasource.core.jdbc-url
、spring.datasource.core.username
和spring.datasource.core.password
岭皂,當(dāng)然沼头,有mongoDB的同學(xué)也可以修改spring.data.mongodb.uri
以獲取完全版體驗(yàn)。
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:3391/oms-daily?serverTimezone=Asia/Shanghai&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/oms-daily
####### 郵件配置(啟用郵件報(bào)警則需要) #######
spring.mail.host=smtp.qq.com
spring.mail.username=aaa
spring.mail.password=bbb
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=0
oms.log.retention.remote=0
oms.container.retention.local=0
oms.container.retention.remote=0
oms.instanceinfo.retention=0
- 完成配置文件的修改后垂蜗,可以直接通過啟動(dòng)類
com.github.kfcfans.oms.server.OhMyApplication
啟動(dòng)調(diào)度服務(wù)器,觀察啟動(dòng)日志么抗,查看是否啟動(dòng)成功~啟動(dòng)成功后蝇刀,訪問 http://127.0.0.1:7700/ 徘溢,如果能順利出現(xiàn)Web界面捆探,則說明調(diào)度服務(wù)器啟動(dòng)成功黍图! - 注冊應(yīng)用:點(diǎn)擊主頁應(yīng)用注冊按鈕奴烙,填入
oms-test
,注冊示例應(yīng)用(當(dāng)然你也可以注冊其他的appName揩环,只是別忘記在示例程序中同步修改~)
編寫示例代碼
進(jìn)入子工程(oh-my-scheduler-worker-samples)幅虑,修改配置文件連接oms-server并編寫自己的處理器代碼。
- 修改oms-worker的啟動(dòng)配置類
com.github.kfcfans.oms.samples.OhMySchedulerConfig
褒墨,將AppName
修改為剛剛在控制臺(tái)注冊的名稱郁妈。
@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)存來加速計(jì)算
config.setStoreStrategy(StoreStrategy.MEMORY);
// 2. 創(chuàng)建 Worker 對象剧腻,設(shè)置配置文件
OhMyWorker ohMyWorker = new OhMyWorker();
ohMyWorker.setConfig(config);
return ohMyWorker;
}
}
- 編寫自己的處理器:隨便找個(gè)地方新建類涂屁,繼承你想要使用的處理器(各個(gè)處理器的介紹可見官方文檔,文檔非常詳細(xì))儒旬,這里為了簡單演示帖族,選擇使用單機(jī)處理器
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(success, context + ": " + success);
}
}
- 啟動(dòng)示例程序,即直接運(yùn)行主類
com.github.kfcfans.oms.samples.SampleApplication
艰亮,觀察控制臺(tái)輸出信息,判斷是否啟動(dòng)成功迄埃。
任務(wù)的配置與運(yùn)行
調(diào)度服務(wù)器與示例工程都啟動(dòng)完畢后,再次前往Web頁面( http://127.0.0.1:7700/ )蕉汪,進(jìn)行任務(wù)的配置與運(yùn)行彩库。
- 在首頁輸入框輸入配置的應(yīng)用名稱,成功操作后會(huì)正式進(jìn)入前端管理界面宛渐。
- 點(diǎn)擊任務(wù)管理 -> 新建任務(wù)(右上角)窥翩,開始創(chuàng)建任務(wù)鳞仙。
- 完成任務(wù)創(chuàng)建后,即可在控制臺(tái)看到剛才創(chuàng)建的任務(wù)仗岸,如果覺得等待調(diào)度太過于漫長借笙,可以直接點(diǎn)擊運(yùn)行按鈕,立即運(yùn)行本任務(wù)盗痒。
- 前往任務(wù)示例邊欄俯邓,查看任務(wù)的運(yùn)行狀態(tài)
基礎(chǔ)的教程到這里也就結(jié)束了~更多功能示例可見官方文檔稽鞭,工作流、MapReduce朦蕴、容器等高級特性等你來探索!