新聞中心
內(nèi)容來源:宜信技術(shù)學(xué)院第4期技術(shù)沙龍-線上直播|宜信微服務(wù)任務(wù)調(diào)度平臺建設(shè)實踐
成都創(chuàng)新互聯(lián)成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元奈曼做網(wǎng)站,已為上家服務(wù),為奈曼各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
主講人:宜信高級架構(gòu)師&開發(fā)平臺負責(zé)人 梁鑫
導(dǎo)讀:如今,無論是互聯(lián)網(wǎng)應(yīng)用還是企業(yè)級應(yīng)用,都充斥著大量的批處理任務(wù),常常需要一些任務(wù)調(diào)度系統(tǒng)幫助我們解決問題。隨著微服務(wù)化架構(gòu)的逐步演進,單體架構(gòu)逐漸演變?yōu)榉植际健⑽⒎?wù)架構(gòu)。
在此背景下,很多之前的任務(wù)調(diào)度平臺已經(jīng)不能滿足業(yè)務(wù)系統(tǒng)的需求,于是出現(xiàn)了一些基于分布式的任務(wù)調(diào)度平臺。這些平臺各有其特點,但也各有不足之處,比如不支持任務(wù)編排、與業(yè)務(wù)高耦合、不支持跨平臺等問題,不是非常符合公司的需求,因此我們開發(fā)了微服務(wù)任務(wù)調(diào)度平臺(SIA-TASK)。本次分享主要圍繞SIA平臺展開,包括研發(fā)背景設(shè)計思路和技術(shù)架構(gòu),以及如何支持業(yè)務(wù)方。
一、SIA-TASK的產(chǎn)生?
1.1 背景
無論是互聯(lián)網(wǎng)應(yīng)用還是企業(yè)級應(yīng)用,都充斥著大量的批處理任務(wù),常常需要一些任務(wù)調(diào)度系統(tǒng)幫助我們解決問題。隨著微服務(wù)化架構(gòu)的逐步演進,單體架構(gòu)逐漸演變?yōu)榉植际健⑽⒎?wù)架構(gòu)。
在這樣的背景下,很多之前的任務(wù)調(diào)度平臺或組件已經(jīng)不能滿足業(yè)務(wù)系統(tǒng)的需求,于是出現(xiàn)了一些基于分布式的任務(wù)調(diào)度平臺。這些平臺各有其特點,但也各有不足之處,比如不支持任務(wù)編排、與業(yè)務(wù)高耦合、不支持跨平臺等問題。
1.2 種類
按照任務(wù)與時間的關(guān)系,我們把批處理任務(wù)分成三類,飛機型、地鐵型、公共汽車型。
- 飛機型是指每年/月/周/天固定某一時刻執(zhí)行的任務(wù)。這種任務(wù)在我們的業(yè)務(wù)系統(tǒng)中非常常見,比如每天1點要執(zhí)行一個跑批任務(wù)去清理前一天的日志;每月10號要給公司全員發(fā)工資,這些都屬于飛機型任務(wù)。
- 地鐵型是指每隔固定時間執(zhí)行任務(wù),不可并發(fā)。我們也經(jīng)常遇到這樣的批處理任務(wù),第一個任務(wù)沒有結(jié)束,第二個任務(wù)是不可以執(zhí)行的,這就是不可并發(fā)。
- 公共汽車型是指每隔固定時間執(zhí)行任務(wù),可并發(fā)。如果是公共汽車型的任務(wù),前一個任務(wù)沒有結(jié)束,下一個任務(wù)也可以按點開始執(zhí)行。
1.3 問題
在跑批任務(wù)的過程中會遇到以下問題:
- 遺忘,忘記了還在運行的定時任務(wù)。在我們公司發(fā)生過一個這樣的案例,若干年前的一個冬天,我們的一個項目團隊用3個月的時間做了一個項目,運行一段時間后發(fā)現(xiàn)項目的效果并不是很理想,便將相關(guān)的程序都停掉了,卻忘了有一個跑批任務(wù)的節(jié)點還在繼續(xù)運行,直到兩年后,這個節(jié)點產(chǎn)生的日志把磁盤填滿了,觸發(fā)了監(jiān)控報警,我們才發(fā)現(xiàn)。
- 單點,就是沒有熱備,跑批任務(wù)是一個單點運行的定時任務(wù),出了故障需要轉(zhuǎn)入手工處理。
- 依賴,利用時間差來處理依賴反復(fù)造成問題數(shù)據(jù)。大家知道項目有的時候是需要有依賴關(guān)系的。比如某個項目的跑批流程A和跑批流程B存在先后次序,項目組設(shè)置跑批流程A在凌晨2點運行,跑批流程B在凌晨4點運行,從時間上保證先后次序,萬一跑批流程A執(zhí)行時間過長,超過2小時,就會導(dǎo)致數(shù)據(jù)出現(xiàn)問題,需要手工處理出現(xiàn)問題的數(shù)據(jù)。
1.4 關(guān)系
前文提到任務(wù)之間是有關(guān)系的,那到底存在哪些關(guān)系呢?我認為主要有以下3種:
- 串行,存在先后關(guān)系的兩個任務(wù)。即任務(wù)B在任務(wù)A后執(zhí)行,要先執(zhí)行任務(wù)A之后再執(zhí)行任務(wù)B。
- 并行,可以并發(fā)執(zhí)行的兩個任務(wù)。比如任務(wù)B和C都要在任務(wù)A之后執(zhí)行,而任務(wù)A執(zhí)行完成后,任務(wù)B和C可以同時執(zhí)行,那B和C就是并行關(guān)系。
- 分支,根據(jù)前置任務(wù)的返回結(jié)果進行判斷,不同的結(jié)果執(zhí)行不同的后續(xù)任務(wù)。比如返回0的時候,執(zhí)行任務(wù)A,返回1的時候執(zhí)行任務(wù)B,這是一種分支的情況。
1.5 思考
基于上述的幾種關(guān)系,我們在建設(shè)任務(wù)調(diào)度平臺的時候會思考以下兩個方面:
- 平臺化。項目團隊總是希望把更多的精力投入到業(yè)務(wù)開發(fā)中,希望把其它與業(yè)務(wù)開發(fā)無關(guān)的事情盡可能地放到架構(gòu)團隊。他們希望有一個執(zhí)行任務(wù)的平臺,僅僅需要把編寫好的業(yè)務(wù)邏輯放到這個平臺就可以了,這個平臺會完成所有的工作,項目組只需要關(guān)心業(yè)務(wù)邏輯。
- 微服務(wù)。為了更好地滿足項目的需求,我們希望能把任務(wù)的業(yè)務(wù)邏輯和任務(wù)的編排調(diào)度區(qū)隔開來,采用注冊和發(fā)現(xiàn)機制來建設(shè)任務(wù)調(diào)度平臺,與業(yè)務(wù)相關(guān)的部分交給項目團隊處理,把其他的部分交給任務(wù)平臺來處理。
1.6 因素
除了上述兩個方面的考慮以外,我們還需要思考以下八個因素。
- 任務(wù)編排。多個業(yè)務(wù)之間的定時任務(wù)存在流程次序,前面提到任務(wù)之間有并行的關(guān)系、有串行的關(guān)系,還有分支的關(guān)系,我們希望平臺能有相應(yīng)的編排功能去處理和支持這些任務(wù)。
- 任務(wù)分片。對于一個大型任務(wù),需要分片并行執(zhí)行。
- 跨平臺。除了使用 Java 技術(shù)棧(SpringBoot、Spring等)的項目之外,還要能夠支持使用其他語言的應(yīng)用。
- 無侵入。業(yè)務(wù)不希望與調(diào)度高耦合,只關(guān)注業(yè)務(wù)的執(zhí)行邏輯,希望平臺對業(yè)務(wù)本身代碼是無侵入的,將影響降到最低。
- 高可用/故障轉(zhuǎn)移。調(diào)度系統(tǒng)自身必須保證高可用,不能有單點,任務(wù)執(zhí)行過程中遇到問題有補償措施,能夠平滑處理,減少人工介入。
- 可視化。任務(wù)調(diào)度的操作提供可視化頁面,方便使用。
- 實時監(jiān)控。平臺要有實時監(jiān)控系統(tǒng),實時獲取任務(wù)的執(zhí)行狀態(tài)。
- 動態(tài)編輯。業(yè)務(wù)的任務(wù)時鐘參數(shù)可能變動,在可視化的基礎(chǔ)上,對所有任務(wù)執(zhí)行的操作都實時反映到業(yè)務(wù)系統(tǒng)中去,不需要停機部署。
基于以上的背景與考慮,我們建設(shè)了微服務(wù)任務(wù)調(diào)度平臺SIA-Task。
二、SIA-TASK的核心設(shè)計思想
2.1 簡介
SIA是“Simple is Awesome”的簡稱。
SIA-TASK(微服務(wù)任務(wù)調(diào)度平臺)是其中的一項重要產(chǎn)品,SIA-Task契合當前微服務(wù)架構(gòu)模式,具有跨平臺、可編排、高可用、無侵入、一致性、異步并行、動態(tài)擴展、實時監(jiān)控等特點。
SIA-TASK是任務(wù)調(diào)度的一體式解決方案,對任務(wù)進行元數(shù)據(jù)采集,然后進行任務(wù)可視化編排,最終進行任務(wù)調(diào)度,并且對任務(wù)采取全流程監(jiān)控,簡單易用。對業(yè)務(wù)完全無侵入,通過簡單靈活的配置即可生成符合預(yù)期的任務(wù)調(diào)度模型。
SIA-TASK借鑒微服務(wù)的設(shè)計思想,獲取分布在每個任務(wù)執(zhí)行器上的任務(wù)元數(shù)據(jù),上傳到任務(wù)注冊中心。利用在線方式進行任務(wù)編排,可動態(tài)修改任務(wù)時鐘,采用HTTP作為任務(wù)調(diào)度協(xié)議,統(tǒng)一使用JSON數(shù)據(jù)格式,由調(diào)度中心進行時鐘解析,執(zhí)行任務(wù)流程,進行任務(wù)通知。
2.2 術(shù)語
簡單介紹一下SIA-TASK的術(shù)語。
- 任務(wù)(Task): 基本執(zhí)行單元,執(zhí)行器對外暴露的一個HTTP調(diào)用接口;
- 作業(yè)(Job): 由一個或者多個存在相互邏輯關(guān)系(串行/并行)的任務(wù)組成,任務(wù)調(diào)度中心調(diào)度的最小單位;
- 計劃(Plan): 由若干個順序執(zhí)行的作業(yè)組成,每個作業(yè)都有自己的執(zhí)行周期,計劃沒有執(zhí)行周期;
- 任務(wù)調(diào)度中心(Scheduler): 根據(jù)每個的作業(yè)的執(zhí)行周期進行調(diào)度,即按照計劃、作業(yè)、任務(wù)的邏輯進行HTTP請求,它是一個單獨的節(jié)點;
- 任務(wù)編排中心(Config): 編排中心使用任務(wù)來創(chuàng)建計劃和作業(yè);
- 任務(wù)執(zhí)行器(Executer): 接收HTTP請求進行業(yè)務(wù)邏輯的執(zhí)行;
- Hunter:Spring項目擴展包,負責(zé)執(zhí)行器中的任務(wù)抓取,上傳注冊中心,業(yè)務(wù)可依賴該組件進行Task編寫。
Job、Task、Plan的關(guān)系
Task是業(yè)務(wù)執(zhí)行的基本單元,執(zhí)行器對外暴露的一個HTTP調(diào)用接口。若干個Task構(gòu)成一個Job,而Plan是由若干個順序執(zhí)行的Job構(gòu)成。
為什么這里需要一個Plan?有的時候兩個任務(wù)不光有順序關(guān)系(就是A任務(wù)執(zhí)行完之后再執(zhí)行B任務(wù)),還需要滿足一定的時間要求,比如上午10點執(zhí)行任務(wù)A,下午2點執(zhí)行任務(wù)B,而且必須保證上午10點任務(wù)A按時執(zhí)行完成。
打個比方,今晚8點有一場足球比賽的直播,如果晚上8點我還不能到家,那我就沒辦法看直播,而如果今天我下班早,下午6點多就到家,也必須等到8點才能開始看球賽,這就是Plan計劃的來源。
2.3 組成
SIA-TASK任務(wù)調(diào)度平臺有以下幾個部分組成:
- 任務(wù)執(zhí)行器,就是你的業(yè)務(wù)代碼在哪里,這是屬于項目組的。
- 任務(wù)注冊中心,我們用的是ZooKeeper。
- 任務(wù)編排中心
- 持久存儲,我們用的是MySQL。
- 任務(wù)調(diào)度中心
2.4 運行
接下來詳細介紹SIA-TASK的運行邏輯。
首先,通過注解抓取任務(wù)執(zhí)行器中的任務(wù)上報到任務(wù)注冊中心。任務(wù)執(zhí)行器在啟動的時候,會有一個叫online Task的注解,只要把這個注解放到control代碼的方法上,就會自動把HTTP接口抓取出來,然后上報到任務(wù)注冊中心,這里我們用的是ZooKeeper。
任務(wù)編排中心從任務(wù)注冊中心獲取數(shù)據(jù)進行編排保存入持久化存儲。也就是說,相當于在執(zhí)行器里,把業(yè)務(wù)調(diào)用HTTP接口請求的URL地址、端口等實例抓取出來上傳到ZooKeeper里,ZooKeeper就拿到了一個個的任務(wù),ZooKeeper會把任務(wù)本身的信息抓取出來放到MySQL里。
這里要區(qū)別一下什么是任務(wù),什么是任務(wù)實例。任務(wù)實例和任務(wù)的關(guān)系,有點像類和對象的關(guān)系,就是一份業(yè)務(wù)邏輯代碼可能部署在多個節(jié)點上,也就是說這些節(jié)點的業(yè)務(wù)邏輯代碼是一模一樣的,在運行階段抓取的時候會把每個節(jié)點上業(yè)務(wù)邏輯代碼都抓取上來,針對這個業(yè)務(wù)它就是一個任務(wù),但是每一個端口、每個IP地址對應(yīng)的可能就是一個任務(wù)實例。比如高可用熱備時,我們會把任務(wù)本身的信息經(jīng)過處理之后保存到持久存儲里,而實例本身的信息只會停留在ZooKeeper里。
任務(wù)配置中心可以根據(jù)ZooKeeper里的信息和MySQL里的信息進行配置,就是根據(jù)抓取的任務(wù),給這些Task加時鐘、策略,然后編排出Job和Plan,并把現(xiàn)在的這些信息保存到MySQL里。
任務(wù)調(diào)度中心從持久化存儲獲取調(diào)度信息,知道編排的Job、Plan、時鐘、策略等邏輯,任務(wù)調(diào)度中心按照調(diào)度邏輯訪問任務(wù)執(zhí)行器,對這些從執(zhí)行器上抓取來的Task進行調(diào)度。
這就是SIA-TASK的運行邏輯,同時我們會把調(diào)度日志存到Kafka里。
2.5 特性
1)基于注解自動抓取任務(wù)
在暴露成HTTP服務(wù)的方法上加入@OnlineTask注解,@OnlineTask會自動抓取方法所在的IP地址、端口、請求路徑、請求方法、請求參數(shù)格式等信息上傳到任務(wù)注冊中心(zookeeper),并同步把任務(wù)信息寫入持久化存儲中。
2)基于注解無侵入多線程控制
單一任務(wù)實例必須保持單線程運行,任務(wù)調(diào)度框架自動攔截@OnlineTask注解進行單線程運行控制,保持在一個任務(wù)運行時不會被再次調(diào)度。而且整個控制過程對開發(fā)者完全無感知。
就是在一個任務(wù)實例上,要保證任務(wù)在運行的時候是單線程狀態(tài)。其實這是由用戶自己控制的,如果需要是單線程的,這里可以加以控制;如果需要是多線程的,可以不加控制。這個控制并不需要另加代碼,只需要在注解上去處理。
3)高度靈活任務(wù)編排模式
SIA-TASK的設(shè)計思想是以任務(wù)為原子,把多個任務(wù)按照執(zhí)行的關(guān)系組合起來形成一個作業(yè)(Job)。同時運行時分為任務(wù)調(diào)度中心和任務(wù)編排中心,使得作業(yè)的調(diào)度和作業(yè)的編排分隔開來,互不影響。在我們需要調(diào)整作業(yè)的流程時,只需要在編排中心進行處理即可。同時編排中心支持任務(wù)按照串行、并行、分支等方式組織關(guān)系。在相同任務(wù)不同任務(wù)實例時,也支持多種調(diào)度方式進行處理,而且整個的處理編排都是在頁面上完成的,這個功能非常好用,這也是SIA-TASK平臺的一個亮點。
4)調(diào)度器自適應(yīng)任務(wù)分配
任務(wù)執(zhí)行過程中出現(xiàn)失敗、異常時,可以根據(jù)任務(wù)定制的策略進行多點重新喚醒任務(wù),保證任務(wù)的不間斷執(zhí)行。我們設(shè)定了很多策略,比如某個Task出現(xiàn)問題了怎么辦?是再喚醒一次?還是不管了?還是人工干預(yù)發(fā)警報?我們定制了很多策略去處理這些問題。
2.6 關(guān)鍵點
了解了平臺特性,我們來梳理SIA-TASK的技術(shù)關(guān)鍵點。
- 任務(wù)流。實現(xiàn)任務(wù)與任務(wù)之間可配置的流向關(guān)系,形成有向無環(huán)圖(DAG)。 任務(wù)流可由定時時間(Cron 表達式)或外部請求(提供 API 地址) 開始,根據(jù) DAG 邏輯執(zhí)行。
- 元數(shù)據(jù)管理。微服務(wù)中各個任務(wù)元數(shù)據(jù)的管理同步數(shù)據(jù)抓取、錄入。
- 智能運維。可視化的任務(wù)實時監(jiān)控,所有監(jiān)控都是有頁面可以看到的;實時預(yù)警機制,出現(xiàn)問題的時候,會發(fā)送郵件或短信給相關(guān)人員告警;半智能化的自主修復(fù),嗅探重試,不需要人工干預(yù)。
- 資源隔離。進程間的資源隔離;進程內(nèi)的資源隔離,提高系統(tǒng)吞吐,提供穩(wěn)定性。時鐘用的是Core Schedule,一個調(diào)度中心對一個項目組用一個Core Schedule,每個項目組在同一個調(diào)度的時候,同一個調(diào)度器上都是隔離的,一個項目組出問題,不會影響到其他的項目組,這就相當于代表了隔離性負載均衡。
- 負載均衡。調(diào)度中心調(diào)度任務(wù)的時候,任務(wù)的執(zhí)行周期時間不一樣,可能有的任務(wù)需要的時間長一點,有的任務(wù)需要的時間短一點,調(diào)度器的資源也不太一樣,有的CPU高一點,有的CPU低一點,那如何保證調(diào)度負載均衡?如何保證資源隔離的負載均衡?我們會根據(jù)這種任務(wù)調(diào)度的歷史值(任務(wù)耗時)以及機器本身性能的值進行考量,使每一個任務(wù)調(diào)度中心擁有的調(diào)度數(shù)量差不多、消耗也差不多。這是一種新的負載,而不是簡單的流量負載。
三、SIA-TASK組成模塊
3.1 首頁
任務(wù)調(diào)度管理首頁主要包括三部分:調(diào)度器信息、調(diào)度次數(shù)、對接項目詳情。
- 調(diào)度器信息:調(diào)度中心調(diào)度器的數(shù)量。
- 調(diào)度次數(shù):調(diào)度中心調(diào)度Job的歷史累計總數(shù)。
- 對接項目詳情:調(diào)度中心對接的項目組總數(shù),Job總數(shù)。
目前SIA-Task平臺上已經(jīng)接入了51個項目,上面跑的Job數(shù)有600多個,今年上線的版本,Job已經(jīng)跑了3000多萬次。
調(diào)度器上有幾個值需要了解一下,每臺調(diào)度器都有三個指標。
- Job上限值:所能負載的Job動態(tài)閾值;
- Job運行數(shù)量:該調(diào)度器當前運行的Job數(shù)量;
- Job預(yù)警值:當調(diào)度器運行的Job數(shù)超過預(yù)警值時,會發(fā)郵件通知管理員。
3.2 調(diào)度器管理
關(guān)于調(diào)度器有幾個 信息需要了解,如圖所示,點擊某個調(diào)度器(柱狀圖),會顯示該調(diào)度器所搶占的Job詳情列表:
- JobKey:所配置的Job名稱,每個Job都有自己的名字。
- 類型:配置Job的定時任務(wù)類型,分為Cron與fixRate兩類。
- Job類型值:如果是Cron表達式,6位時間戳怎么寫;如果是fixRate,那就是需要間隔多少時間。
- 預(yù)警郵箱:該Job配置的預(yù)警郵箱。
- 描述信息:描述該Job的功能信息,便于管理員能夠迅速發(fā)現(xiàn)某臺調(diào)度器所搶占的Job詳情。
調(diào)度器包括工作調(diào)度器、下線調(diào)度器、離線調(diào)度器、白名單。
- 工作調(diào)度器:這類調(diào)度器具有搶占和調(diào)度Job的能力。對某調(diào)度器進行下線操作,它會立即失去搶占Job的能力,已經(jīng)搶占的Job執(zhí)行完畢后會自動釋放,進而被其他調(diào)度器搶占,調(diào)度器下線后會進入下線調(diào)度器列表中;工作調(diào)度器列表提供下線以及批量下線的功能。簡單來說,工作調(diào)度器就是正在工作中的調(diào)度器。
- 下線調(diào)度器:這類調(diào)度器進程仍然存活,但失去了搶占Job與參與調(diào)度的能力。對這類調(diào)度器執(zhí)行上線操作,會進入工作調(diào)度器列表,且開始具有搶占和調(diào)度Job的能力;下線調(diào)度器列表提供上線及批量上線的功能。就是說,下線調(diào)度器依然活著,只是不再參與搶占Job,之前已經(jīng)有的Job還是會繼續(xù)執(zhí)行完成,如果點擊上線就重新具備搶占Job的能力,變成工作調(diào)度器。
- 離線調(diào)度器:這類調(diào)度器進程不再存活,當下線調(diào)度器進程死亡后,會自動進入離線調(diào)度器列表,這類調(diào)度器進程重新啟動后,會自動進入下線調(diào)度器列表;離線調(diào)度器列表也提供刪除及批量刪除的功能。離線調(diào)度器一般都是出現(xiàn)問題了,可能是進程掛掉了,也可能是網(wǎng)絡(luò)故障了。
- 白名單:將某個IP加入白名單之后,它具有調(diào)用所有執(zhí)行器實例的權(quán)限;白名單列表提供批量刪除的功能,刪除該IP后自動失去該權(quán)限。
3.3 調(diào)度監(jiān)控
上圖所示是SIA-TASK的調(diào)度監(jiān)控頁面,分著的一塊一塊區(qū)域?qū)儆诓煌椖拷M。目前SIA-Task接入了51個項目,準備中的有500多個,正在運行的有25個。
有的Job執(zhí)行非常快,幾秒鐘就執(zhí)行完了,有的Job執(zhí)行非常慢,需要很長的時間,我們在狀態(tài)抓取的時候,只能抓取到時間長的Job,這些被抓取的Job顯示為正在運行,而時間短的捕捉不到,但它們都處于執(zhí)行狀態(tài),這些沒有被抓取到的Job就顯示為準備中。
可能有的Job這段時間不需要運行,可以手動停止,剩下的就是異常停止的Job,需要發(fā)送郵件告警。
我們也提供了檢索的能力,可以接受不同項目組登錄查詢自己的項目運行狀態(tài)。
3.4 Task管理
Task管理界面中,Task按項目組分組顯示,主要提供Task的配置、修改與刪除等功能。Task包含兩部分:一部分Task使用了sia-Task-hunter組件,通過標準注解實現(xiàn)Task的自動抓取,這類Task不允許修改;另外一部分Task是由用戶手動添加的,我知道訪問的URL和HTTP地址,手動添加進來,這部分Task支持跨平臺的抓取,而且可以修改和刪除。
一個Task管理包含以下幾個部分內(nèi)容:項目名稱、應(yīng)用名稱、任務(wù)名稱、機器地址、描述、以及查看/修改/連通性測試等操作。同一個Task名稱,不同的機器地址,代表一個任務(wù)和不同的任務(wù)實例。
3.5 Job管理
前面介紹了一個Job由若干個Task組成,圖中每一個不同的列代表項目名稱,點擊下拉列表可以顯示所有的項目,可以進行過濾、添加、狀態(tài)查看等操作。
其中狀態(tài)操作可以手工執(zhí)行,可以停止或激活Job,Job配置好之后屬于未激活的狀態(tài),需要激活一下。還可以修改Job里的信息,配置Job等。
如何添加Job?假如我要添加一個Cron表達式類型的Job,需要添加哪些內(nèi)容呢?
因為Job是Cron表達式類型的,首先我需要輸入六位表達式內(nèi)容,還要添加一個預(yù)警郵箱,再描述這個Job,每個Job都有一個key,最后還需要添加Job_key。這樣一個新的Job就添加好了。
回過頭來看,添加Job需要配置Task信息,這是一個比較復(fù)雜的過程。一個Job由若干個Task組成,我們可以用拖拉拽的方式根據(jù)Task之間的關(guān)系確定形成組成Job的所有Task的順序關(guān)系。還可以以不同顏色代表不同項目進行區(qū)分,當然只有管理員才有權(quán)限看到所有項目,各個項目的負責(zé)人只能看到自己所屬項目的狀態(tài)。
上傳Task的時候會帶一些參數(shù),所以還涉及到參數(shù)的處理,比如參數(shù)類型、參數(shù)值、過期時間等。重點聊聊過期時間。
通過HTTP方式調(diào)用會遇到一個問題:到底Task什么時間會執(zhí)行完成。為解決這個問題,就需要設(shè)一個Task的過期時間,只要過期時間一到,就會轉(zhuǎn)入其他策略,比如放棄或人工處理等。因為作為異步調(diào)用,不可能無休止地等待客戶端返回結(jié)果。
當然也可能存在一種情況:我得到的結(jié)果是超時了,實際上任務(wù)是在正確執(zhí)行,而且再過一段時間給我返回結(jié)果了。我們曾經(jīng)設(shè)計了一種隊列補償機制來處理這個問題,但是好像意義不大。當然,這只是一種可能,平臺上線至今沒有出現(xiàn)過。
目前平臺的Task_選取實例策略包括兩種:
- 隨機,從可選的列表中,隨機選擇實例,即IP+端口;
- 固定IP,指定實例,隨后需要從可選列表中人工指定實例。
平臺支持四種Task_調(diào)用失敗策略: - STOP,停止策略,調(diào)用失敗則整個Job停止,不再執(zhí)行后續(xù)Task;
- IGNORE,忽略策略,調(diào)用失敗則跳過該Task,繼續(xù)執(zhí)行后續(xù)Task;
- TRANSFER,轉(zhuǎn)移策略,選取該Task的其他實例執(zhí)行,如果依然失敗,則使用停止策略;
- MULTI_CALLS_TRANSFER,多次調(diào)用再轉(zhuǎn)移策略,重復(fù)調(diào)用該Task多次,如果依然失敗,則使用轉(zhuǎn)移策略。
3.6 調(diào)度日志
日志管理提供了Job的運行日志相關(guān)信息,按項目組分組顯示,一條Job日志的關(guān)鍵元素包含:
- 執(zhí)行狀態(tài):表示該Job執(zhí)行結(jié)果;
- 執(zhí)行時間:表示調(diào)度器調(diào)度Job的時間;
- 執(zhí)行完成時間:表示Job執(zhí)行完成的時間;
- 調(diào)度信息:表示執(zhí)行Job的調(diào)度器實例;
- 執(zhí)行信息:Job執(zhí)行的具體信息,并且已實現(xiàn)Job與所引用的Task的執(zhí)行日志信息的關(guān)聯(lián),日志默認保存七天。
四、開源
SIA-TASK作為SIA團隊的一個重要產(chǎn)品,在公司接入了數(shù)十個項目,運行著數(shù)百個Job,經(jīng)受住了穩(wěn)定性的考驗。
SIA-TASK微服務(wù)調(diào)度平臺于5月已經(jīng)開源,開源地址:https://github.com/siaorg/sia-Task,感興趣的同學(xué)可以登錄查看詳細介紹。
分享者:梁鑫
來源:宜信技術(shù)學(xué)院
標題名稱:宜信微服務(wù)任務(wù)調(diào)度平臺建設(shè)實踐|分享實錄
文章路徑:http://www.ef60e0e.cn/article/gjcohe.html