分布式調(diào)度平臺(tái) OhMyScheduler 快速入門

概述

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)目

  1. git clone https://github.com/KFCFans/OhMyScheduler.git
  2. 導(dǎo)入 IDEA堂竟,源碼結(jié)構(gòu)如下,我們需要啟動(dòng)調(diào)度服務(wù)器(oms-server)漱牵,同時(shí)在samples工程中編寫自己的處理器代碼
image.png

啟動(dòng)調(diào)度服務(wù)器

  1. 創(chuàng)建數(shù)據(jù)庫(僅需要?jiǎng)?chuàng)建數(shù)據(jù)庫):找到你的DB酣胀,運(yùn)行SQLCREATE database if NOT EXISTS oms-daily default character set utf8mb4 collate utf8mb4_unicode_ci娶聘,搞定~
  2. 修改配置文件,配置文件的說明官方文檔寫的非常詳細(xì)铆农,此處不再贅述狡耻。必須需要修改的地方有spring.datasource.core.jdbc-urlspring.datasource.core.usernamespring.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
  1. 完成配置文件的修改后垂蜗,可以直接通過啟動(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)成功黍图!
  2. 注冊應(yīng)用:點(diǎn)擊主頁應(yīng)用注冊按鈕奴烙,填入 oms-test,注冊示例應(yīng)用(當(dāng)然你也可以注冊其他的appName揩环,只是別忘記在示例程序中同步修改~)
reg

編寫示例代碼

進(jìn)入子工程(oh-my-scheduler-worker-samples)幅虑,修改配置文件連接oms-server并編寫自己的處理器代碼。

  1. 修改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;
    }
}
  1. 編寫自己的處理器:隨便找個(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);
    }
}
  1. 啟動(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)行彩库。

  1. 在首頁輸入框輸入配置的應(yīng)用名稱,成功操作后會(huì)正式進(jìn)入前端管理界面宛渐。
main
  1. 點(diǎn)擊任務(wù)管理 -> 新建任務(wù)(右上角)窥翩,開始創(chuàng)建任務(wù)鳞仙。
first
  1. 完成任務(wù)創(chuàng)建后,即可在控制臺(tái)看到剛才創(chuàng)建的任務(wù)仗岸,如果覺得等待調(diào)度太過于漫長借笙,可以直接點(diǎn)擊運(yùn)行按鈕,立即運(yùn)行本任務(wù)盗痒。
m
  1. 前往任務(wù)示例邊欄俯邓,查看任務(wù)的運(yùn)行狀態(tài)
d

基礎(chǔ)的教程到這里也就結(jié)束了~更多功能示例可見官方文檔稽鞭,工作流、MapReduce朦蕴、容器等高級特性等你來探索!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市亮瓷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚓胸,老刑警劉巖除师,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汛聚,死亡現(xiàn)場離奇詭異,居然都是意外死亡倚舀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門风罩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來超升,“玉大人哺徊,你說我怎么就攤上這事⊙衅梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵雹熬,是天一觀的道長竿报。 經(jīng)常有香客問我继谚,道長,這世上最難降的妖魔是什么芽世? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮荠割,結(jié)果婚禮上旺矾,老公的妹妹穿的比我還像新娘。我一直安慰自己嚎朽,他們只是感情好柬帕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著魁索,像睡著了一般盼铁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饶火,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天肤寝,我揣著相機(jī)與錄音,去河邊找鬼鲤看。 笑死,一個(gè)胖子當(dāng)著我的面吹牛找筝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袖裕,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼急鳄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疾宏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兢榨,失蹤者是張志新(化名)和其女友劉穎顺饮,沒想到半個(gè)月后兼雄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赦肋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年佃乘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驹尼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡程帕,死狀恐怖愁拭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岭埠,我是刑警寧澤蔚鸥,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站来涨,受9級特大地震影響启盛,放射性物質(zhì)發(fā)生泄漏技羔。R本人自食惡果不足惜卧抗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拙绊。 院中可真熱鬧,春花似錦标沪、人聲如沸嗜傅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趁曼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挡闰,已是汗流浹背掰盘。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庆杜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓叨橱,卻偏偏與公主長得像断盛,于是被迫代替她去往敵國和親罗洗。 傳聞我的和親對象是個(gè)殘疾皇子捏鱼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355