溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

宜信微服務(wù)任務(wù)調(diào)度平臺(tái)建設(shè)實(shí)踐|分享實(shí)錄

發(fā)布時(shí)間:2020-06-14 06:22:18 來(lái)源:網(wǎng)絡(luò) 閱讀:3156 作者:宜信技術(shù) 欄目:軟件技術(shù)

內(nèi)容來(lái)源:宜信技術(shù)學(xué)院第4期技術(shù)沙龍-線上直播|宜信微服務(wù)任務(wù)調(diào)度平臺(tái)建設(shè)實(shí)踐

主講人:宜信高級(jí)架構(gòu)師&開(kāi)發(fā)平臺(tái)負(fù)責(zé)人 梁鑫

導(dǎo)讀:如今,無(wú)論是互聯(lián)網(wǎng)應(yīng)用還是企業(yè)級(jí)應(yīng)用,都充斥著大量的批處理任務(wù),常常需要一些任務(wù)調(diào)度系統(tǒng)幫助我們解決問(wèn)題。隨著微服務(wù)化架構(gòu)的逐步演進(jìn),單體架構(gòu)逐漸演變?yōu)榉植际健⑽⒎?wù)架構(gòu)。

在此背景下,很多之前的任務(wù)調(diào)度平臺(tái)已經(jīng)不能滿足業(yè)務(wù)系統(tǒng)的需求,于是出現(xiàn)了一些基于分布式的任務(wù)調(diào)度平臺(tái)。這些平臺(tái)各有其特點(diǎn),但也各有不足之處,比如不支持任務(wù)編排、與業(yè)務(wù)高耦合、不支持跨平臺(tái)等問(wèn)題,不是非常符合公司的需求,因此我們開(kāi)發(fā)了微服務(wù)任務(wù)調(diào)度平臺(tái)(SIA-TASK)。本次分享主要圍繞SIA平臺(tái)展開(kāi),包括研發(fā)背景設(shè)計(jì)思路和技術(shù)架構(gòu),以及如何支持業(yè)務(wù)方。

一、SIA-TASK的產(chǎn)生?

1.1 背景

無(wú)論是互聯(lián)網(wǎng)應(yīng)用還是企業(yè)級(jí)應(yīng)用,都充斥著大量的批處理任務(wù),常常需要一些任務(wù)調(diào)度系統(tǒng)幫助我們解決問(wèn)題。隨著微服務(wù)化架構(gòu)的逐步演進(jìn),單體架構(gòu)逐漸演變?yōu)榉植际?、微服?wù)架構(gòu)。

在這樣的背景下,很多之前的任務(wù)調(diào)度平臺(tái)或組件已經(jīng)不能滿足業(yè)務(wù)系統(tǒng)的需求,于是出現(xiàn)了一些基于分布式的任務(wù)調(diào)度平臺(tái)。這些平臺(tái)各有其特點(diǎn),但也各有不足之處,比如不支持任務(wù)編排、與業(yè)務(wù)高耦合、不支持跨平臺(tái)等問(wèn)題。

1.2 種類

按照任務(wù)與時(shí)間的關(guān)系,我們把批處理任務(wù)分成三類,飛機(jī)型、地鐵型、公共汽車型。

  • 飛機(jī)型是指每年/月/周/天固定某一時(shí)刻執(zhí)行的任務(wù)。這種任務(wù)在我們的業(yè)務(wù)系統(tǒng)中非常常見(jiàn),比如每天1點(diǎn)要執(zhí)行一個(gè)跑批任務(wù)去清理前一天的日志;每月10號(hào)要給公司全員發(fā)工資,這些都屬于飛機(jī)型任務(wù)。
  • 地鐵型是指每隔固定時(shí)間執(zhí)行任務(wù),不可并發(fā)。我們也經(jīng)常遇到這樣的批處理任務(wù),第一個(gè)任務(wù)沒(méi)有結(jié)束,第二個(gè)任務(wù)是不可以執(zhí)行的,這就是不可并發(fā)。
  • 公共汽車型是指每隔固定時(shí)間執(zhí)行任務(wù),可并發(fā)。如果是公共汽車型的任務(wù),前一個(gè)任務(wù)沒(méi)有結(jié)束,下一個(gè)任務(wù)也可以按點(diǎn)開(kāi)始執(zhí)行。

1.3 問(wèn)題

宜信微服務(wù)任務(wù)調(diào)度平臺(tái)建設(shè)實(shí)踐|分享實(shí)錄

在跑批任務(wù)的過(guò)程中會(huì)遇到以下問(wèn)題:

  • 遺忘,忘記了還在運(yùn)行的定時(shí)任務(wù)。在我們公司發(fā)生過(guò)一個(gè)這樣的案例,若干年前的一個(gè)冬天,我們的一個(gè)項(xiàng)目團(tuán)隊(duì)用3個(gè)月的時(shí)間做了一個(gè)項(xiàng)目,運(yùn)行一段時(shí)間后發(fā)現(xiàn)項(xiàng)目的效果并不是很理想,便將相關(guān)的程序都停掉了,卻忘了有一個(gè)跑批任務(wù)的節(jié)點(diǎn)還在繼續(xù)運(yùn)行,直到兩年后,這個(gè)節(jié)點(diǎn)產(chǎn)生的日志把磁盤填滿了,觸發(fā)了監(jiān)控報(bào)警,我們才發(fā)現(xiàn)。
  • 單點(diǎn),就是沒(méi)有熱備,跑批任務(wù)是一個(gè)單點(diǎn)運(yùn)行的定時(shí)任務(wù),出了故障需要轉(zhuǎn)入手工處理。
  • 依賴,利用時(shí)間差來(lái)處理依賴反復(fù)造成問(wèn)題數(shù)據(jù)。大家知道項(xiàng)目有的時(shí)候是需要有依賴關(guān)系的。比如某個(gè)項(xiàng)目的跑批流程A和跑批流程B存在先后次序,項(xiàng)目組設(shè)置跑批流程A在凌晨2點(diǎn)運(yùn)行,跑批流程B在凌晨4點(diǎn)運(yùn)行,從時(shí)間上保證先后次序,萬(wàn)一跑批流程A執(zhí)行時(shí)間過(guò)長(zhǎng),超過(guò)2小時(shí),就會(huì)導(dǎo)致數(shù)據(jù)出現(xiàn)問(wèn)題,需要手工處理出現(xiàn)問(wèn)題的數(shù)據(jù)。

1.4 關(guān)系

前文提到任務(wù)之間是有關(guān)系的,那到底存在哪些關(guān)系呢?我認(rèn)為主要有以下3種:

  • 串行,存在先后關(guān)系的兩個(gè)任務(wù)。即任務(wù)B在任務(wù)A后執(zhí)行,要先執(zhí)行任務(wù)A之后再執(zhí)行任務(wù)B。
  • 并行,可以并發(fā)執(zhí)行的兩個(gè)任務(wù)。比如任務(wù)B和C都要在任務(wù)A之后執(zhí)行,而任務(wù)A執(zhí)行完成后,任務(wù)B和C可以同時(shí)執(zhí)行,那B和C就是并行關(guān)系。
  • 分支,根據(jù)前置任務(wù)的返回結(jié)果進(jìn)行判斷,不同的結(jié)果執(zhí)行不同的后續(xù)任務(wù)。比如返回0的時(shí)候,執(zhí)行任務(wù)A,返回1的時(shí)候執(zhí)行任務(wù)B,這是一種分支的情況。

1.5 思考

基于上述的幾種關(guān)系,我們?cè)诮ㄔO(shè)任務(wù)調(diào)度平臺(tái)的時(shí)候會(huì)思考以下兩個(gè)方面:

  • 平臺(tái)化。項(xiàng)目團(tuán)隊(duì)總是希望把更多的精力投入到業(yè)務(wù)開(kāi)發(fā)中,希望把其它與業(yè)務(wù)開(kāi)發(fā)無(wú)關(guān)的事情盡可能地放到架構(gòu)團(tuán)隊(duì)。他們希望有一個(gè)執(zhí)行任務(wù)的平臺(tái),僅僅需要把編寫好的業(yè)務(wù)邏輯放到這個(gè)平臺(tái)就可以了,這個(gè)平臺(tái)會(huì)完成所有的工作,項(xiàng)目組只需要關(guān)心業(yè)務(wù)邏輯。
  • 微服務(wù)。為了更好地滿足項(xiàng)目的需求,我們希望能把任務(wù)的業(yè)務(wù)邏輯和任務(wù)的編排調(diào)度區(qū)隔開(kāi)來(lái),采用注冊(cè)和發(fā)現(xiàn)機(jī)制來(lái)建設(shè)任務(wù)調(diào)度平臺(tái),與業(yè)務(wù)相關(guān)的部分交給項(xiàng)目團(tuán)隊(duì)處理,把其他的部分交給任務(wù)平臺(tái)來(lái)處理。

1.6 因素

除了上述兩個(gè)方面的考慮以外,我們還需要思考以下八個(gè)因素。

  • 任務(wù)編排。多個(gè)業(yè)務(wù)之間的定時(shí)任務(wù)存在流程次序,前面提到任務(wù)之間有并行的關(guān)系、有串行的關(guān)系,還有分支的關(guān)系,我們希望平臺(tái)能有相應(yīng)的編排功能去處理和支持這些任務(wù)。
  • 任務(wù)分片。對(duì)于一個(gè)大型任務(wù),需要分片并行執(zhí)行。
  • 跨平臺(tái)。除了使用 Java 技術(shù)棧(SpringBoot、Spring等)的項(xiàng)目之外,還要能夠支持使用其他語(yǔ)言的應(yīng)用。
  • 無(wú)侵入。業(yè)務(wù)不希望與調(diào)度高耦合,只關(guān)注業(yè)務(wù)的執(zhí)行邏輯,希望平臺(tái)對(duì)業(yè)務(wù)本身代碼是無(wú)侵入的,將影響降到最低。
  • 高可用/故障轉(zhuǎn)移。調(diào)度系統(tǒng)自身必須保證高可用,不能有單點(diǎn),任務(wù)執(zhí)行過(guò)程中遇到問(wèn)題有補(bǔ)償措施,能夠平滑處理,減少人工介入。
  • 可視化。任務(wù)調(diào)度的操作提供可視化頁(yè)面,方便使用。
  • 實(shí)時(shí)監(jiān)控。平臺(tái)要有實(shí)時(shí)監(jiān)控系統(tǒng),實(shí)時(shí)獲取任務(wù)的執(zhí)行狀態(tài)。
  • 動(dòng)態(tài)編輯。業(yè)務(wù)的任務(wù)時(shí)鐘參數(shù)可能變動(dòng),在可視化的基礎(chǔ)上,對(duì)所有任務(wù)執(zhí)行的操作都實(shí)時(shí)反映到業(yè)務(wù)系統(tǒng)中去,不需要停機(jī)部署。

基于以上的背景與考慮,我們建設(shè)了微服務(wù)任務(wù)調(diào)度平臺(tái)SIA-Task。

二、SIA-TASK的核心設(shè)計(jì)思想

2.1 簡(jiǎn)介

SIA是“Simple is Awesome”的簡(jiǎn)稱。

SIA-TASK(微服務(wù)任務(wù)調(diào)度平臺(tái))是其中的一項(xiàng)重要產(chǎn)品,SIA-Task契合當(dāng)前微服務(wù)架構(gòu)模式,具有跨平臺(tái)、可編排、高可用、無(wú)侵入、一致性、異步并行、動(dòng)態(tài)擴(kuò)展、實(shí)時(shí)監(jiān)控等特點(diǎn)。

SIA-TASK是任務(wù)調(diào)度的一體式解決方案,對(duì)任務(wù)進(jìn)行元數(shù)據(jù)采集,然后進(jìn)行任務(wù)可視化編排,最終進(jìn)行任務(wù)調(diào)度,并且對(duì)任務(wù)采取全流程監(jiān)控,簡(jiǎn)單易用。對(duì)業(yè)務(wù)完全無(wú)侵入,通過(guò)簡(jiǎn)單靈活的配置即可生成符合預(yù)期的任務(wù)調(diào)度模型。

SIA-TASK借鑒微服務(wù)的設(shè)計(jì)思想,獲取分布在每個(gè)任務(wù)執(zhí)行器上的任務(wù)元數(shù)據(jù),上傳到任務(wù)注冊(cè)中心。利用在線方式進(jìn)行任務(wù)編排,可動(dòng)態(tài)修改任務(wù)時(shí)鐘,采用HTTP作為任務(wù)調(diào)度協(xié)議,統(tǒng)一使用JSON數(shù)據(jù)格式,由調(diào)度中心進(jìn)行時(shí)鐘解析,執(zhí)行任務(wù)流程,進(jìn)行任務(wù)通知。

2.2 術(shù)語(yǔ)

簡(jiǎn)單介紹一下SIA-TASK的術(shù)語(yǔ)。

  • 任務(wù)(Task): 基本執(zhí)行單元,執(zhí)行器對(duì)外暴露的一個(gè)HTTP調(diào)用接口;
  • 作業(yè)(Job): 由一個(gè)或者多個(gè)存在相互邏輯關(guān)系(串行/并行)的任務(wù)組成,任務(wù)調(diào)度中心調(diào)度的最小單位;
  • 計(jì)劃(Plan): 由若干個(gè)順序執(zhí)行的作業(yè)組成,每個(gè)作業(yè)都有自己的執(zhí)行周期,計(jì)劃沒(méi)有執(zhí)行周期;
  • 任務(wù)調(diào)度中心(Scheduler): 根據(jù)每個(gè)的作業(yè)的執(zhí)行周期進(jìn)行調(diào)度,即按照計(jì)劃、作業(yè)、任務(wù)的邏輯進(jìn)行HTTP請(qǐng)求,它是一個(gè)單獨(dú)的節(jié)點(diǎn);
  • 任務(wù)編排中心(Config): 編排中心使用任務(wù)來(lái)創(chuàng)建計(jì)劃和作業(yè);
  • 任務(wù)執(zhí)行器(Executer): 接收HTTP請(qǐng)求進(jìn)行業(yè)務(wù)邏輯的執(zhí)行;
  • Hunter:Spring項(xiàng)目擴(kuò)展包,負(fù)責(zé)執(zhí)行器中的任務(wù)抓取,上傳注冊(cè)中心,業(yè)務(wù)可依賴該組件進(jìn)行Task編寫。
Job、Task、Plan的關(guān)系

Task是業(yè)務(wù)執(zhí)行的基本單元,執(zhí)行器對(duì)外暴露的一個(gè)HTTP調(diào)用接口。若干個(gè)Task構(gòu)成一個(gè)Job,而Plan是由若干個(gè)順序執(zhí)行的Job構(gòu)成。

為什么這里需要一個(gè)Plan?有的時(shí)候兩個(gè)任務(wù)不光有順序關(guān)系(就是A任務(wù)執(zhí)行完之后再執(zhí)行B任務(wù)),還需要滿足一定的時(shí)間要求,比如上午10點(diǎn)執(zhí)行任務(wù)A,下午2點(diǎn)執(zhí)行任務(wù)B,而且必須保證上午10點(diǎn)任務(wù)A按時(shí)執(zhí)行完成。

打個(gè)比方,今晚8點(diǎn)有一場(chǎng)足球比賽的直播,如果晚上8點(diǎn)我還不能到家,那我就沒(méi)辦法看直播,而如果今天我下班早,下午6點(diǎn)多就到家,也必須等到8點(diǎn)才能開(kāi)始看球賽,這就是Plan計(jì)劃的來(lái)源。

2.3 組成

宜信微服務(wù)任務(wù)調(diào)度平臺(tái)建設(shè)實(shí)踐|分享實(shí)錄

SIA-TASK任務(wù)調(diào)度平臺(tái)有以下幾個(gè)部分組成:

  • 任務(wù)執(zhí)行器,就是你的業(yè)務(wù)代碼在哪里,這是屬于項(xiàng)目組的。
  • 任務(wù)注冊(cè)中心,我們用的是ZooKeeper。
  • 任務(wù)編排中心
  • 持久存儲(chǔ),我們用的是MySQL。
  • 任務(wù)調(diào)度中心

2.4 運(yùn)行

宜信微服務(wù)任務(wù)調(diào)度平臺(tái)建設(shè)實(shí)踐|分享實(shí)錄

接下來(lái)詳細(xì)介紹SIA-TASK的運(yùn)行邏輯。

首先,通過(guò)注解抓取任務(wù)執(zhí)行器中的任務(wù)上報(bào)到任務(wù)注冊(cè)中心。任務(wù)執(zhí)行器在啟動(dòng)的時(shí)候,會(huì)有一個(gè)叫online Task的注解,只要把這個(gè)注解放到control代碼的方法上,就會(huì)自動(dòng)把HTTP接口抓取出來(lái),然后上報(bào)到任務(wù)注冊(cè)中心,這里我們用的是ZooKeeper。

任務(wù)編排中心從任務(wù)注冊(cè)中心獲取數(shù)據(jù)進(jìn)行編排保存入持久化存儲(chǔ)。也就是說(shuō),相當(dāng)于在執(zhí)行器里,把業(yè)務(wù)調(diào)用HTTP接口請(qǐng)求的URL地址、端口等實(shí)例抓取出來(lái)上傳到ZooKeeper里,ZooKeeper就拿到了一個(gè)個(gè)的任務(wù),ZooKeeper會(huì)把任務(wù)本身的信息抓取出來(lái)放到MySQL里。

這里要區(qū)別一下什么是任務(wù),什么是任務(wù)實(shí)例。任務(wù)實(shí)例和任務(wù)的關(guān)系,有點(diǎn)像類和對(duì)象的關(guān)系,就是一份業(yè)務(wù)邏輯代碼可能部署在多個(gè)節(jié)點(diǎn)上,也就是說(shuō)這些節(jié)點(diǎn)的業(yè)務(wù)邏輯代碼是一模一樣的,在運(yùn)行階段抓取的時(shí)候會(huì)把每個(gè)節(jié)點(diǎn)上業(yè)務(wù)邏輯代碼都抓取上來(lái),針對(duì)這個(gè)業(yè)務(wù)它就是一個(gè)任務(wù),但是每一個(gè)端口、每個(gè)IP地址對(duì)應(yīng)的可能就是一個(gè)任務(wù)實(shí)例。比如高可用熱備時(shí),我們會(huì)把任務(wù)本身的信息經(jīng)過(guò)處理之后保存到持久存儲(chǔ)里,而實(shí)例本身的信息只會(huì)停留在ZooKeeper里。

任務(wù)配置中心可以根據(jù)ZooKeeper里的信息和MySQL里的信息進(jìn)行配置,就是根據(jù)抓取的任務(wù),給這些Task加時(shí)鐘、策略,然后編排出Job和Plan,并把現(xiàn)在的這些信息保存到MySQL里。

任務(wù)調(diào)度中心從持久化存儲(chǔ)獲取調(diào)度信息,知道編排的Job、Plan、時(shí)鐘、策略等邏輯,任務(wù)調(diào)度中心按照調(diào)度邏輯訪問(wèn)任務(wù)執(zhí)行器,對(duì)這些從執(zhí)行器上抓取來(lái)的Task進(jìn)行調(diào)度。

這就是SIA-TASK的運(yùn)行邏輯,同時(shí)我們會(huì)把調(diào)度日志存到Kafka里。

2.5 特性

1)基于注解自動(dòng)抓取任務(wù)

在暴露成HTTP服務(wù)的方法上加入@OnlineTask注解,@OnlineTask會(huì)自動(dòng)抓取方法所在的IP地址、端口、請(qǐng)求路徑、請(qǐng)求方法、請(qǐng)求參數(shù)格式等信息上傳到任務(wù)注冊(cè)中心(zookeeper),并同步把任務(wù)信息寫入持久化存儲(chǔ)中。

2)基于注解無(wú)侵入多線程控制

單一任務(wù)實(shí)例必須保持單線程運(yùn)行,任務(wù)調(diào)度框架自動(dòng)攔截@OnlineTask注解進(jìn)行單線程運(yùn)行控制,保持在一個(gè)任務(wù)運(yùn)行時(shí)不會(huì)被再次調(diào)度。而且整個(gè)控制過(guò)程對(duì)開(kāi)發(fā)者完全無(wú)感知。

就是在一個(gè)任務(wù)實(shí)例上,要保證任務(wù)在運(yùn)行的時(shí)候是單線程狀態(tài)。其實(shí)這是由用戶自己控制的,如果需要是單線程的,這里可以加以控制;如果需要是多線程的,可以不加控制。這個(gè)控制并不需要另加代碼,只需要在注解上去處理。

3)高度靈活任務(wù)編排模式

SIA-TASK的設(shè)計(jì)思想是以任務(wù)為原子,把多個(gè)任務(wù)按照?qǐng)?zhí)行的關(guān)系組合起來(lái)形成一個(gè)作業(yè)(Job)。同時(shí)運(yùn)行時(shí)分為任務(wù)調(diào)度中心和任務(wù)編排中心,使得作業(yè)的調(diào)度和作業(yè)的編排分隔開(kāi)來(lái),互不影響。在我們需要調(diào)整作業(yè)的流程時(shí),只需要在編排中心進(jìn)行處理即可。同時(shí)編排中心支持任務(wù)按照串行、并行、分支等方式組織關(guān)系。在相同任務(wù)不同任務(wù)實(shí)例時(shí),也支持多種調(diào)度方式進(jìn)行處理,而且整個(gè)的處理編排都是在頁(yè)面上完成的,這個(gè)功能非常好用,這也是SIA-TASK平臺(tái)的一個(gè)亮點(diǎn)。

4)調(diào)度器自適應(yīng)任務(wù)分配

任務(wù)執(zhí)行過(guò)程中出現(xiàn)失敗、異常時(shí),可以根據(jù)任務(wù)定制的策略進(jìn)行多點(diǎn)重新喚醒任務(wù),保證任務(wù)的不間斷執(zhí)行。我們?cè)O(shè)定了很多策略,比如某個(gè)Task出現(xiàn)問(wèn)題了怎么辦?是再喚醒一次?還是不管了?還是人工干預(yù)發(fā)警報(bào)?我們定制了很多策略去處理這些問(wèn)題。

2.6 關(guān)鍵點(diǎn)

了解了平臺(tái)特性,我們來(lái)梳理SIA-TASK的技術(shù)關(guān)鍵點(diǎn)。

  • 任務(wù)流。實(shí)現(xiàn)任務(wù)與任務(wù)之間可配置的流向關(guān)系,形成有向無(wú)環(huán)圖(DAG)。 任務(wù)流可由定時(shí)時(shí)間(Cron 表達(dá)式)或外部請(qǐng)求(提供 API 地址) 開(kāi)始,根據(jù) DAG 邏輯執(zhí)行。
  • 元數(shù)據(jù)管理。微服務(wù)中各個(gè)任務(wù)元數(shù)據(jù)的管理同步數(shù)據(jù)抓取、錄入。
  • 智能運(yùn)維??梢暬娜蝿?wù)實(shí)時(shí)監(jiān)控,所有監(jiān)控都是有頁(yè)面可以看到的;實(shí)時(shí)預(yù)警機(jī)制,出現(xiàn)問(wèn)題的時(shí)候,會(huì)發(fā)送郵件或短信給相關(guān)人員告警;半智能化的自主修復(fù),嗅探重試,不需要人工干預(yù)。
  • 資源隔離。進(jìn)程間的資源隔離;進(jìn)程內(nèi)的資源隔離,提高系統(tǒng)吞吐,提供穩(wěn)定性。時(shí)鐘用的是Core Schedule,一個(gè)調(diào)度中心對(duì)一個(gè)項(xiàng)目組用一個(gè)Core Schedule,每個(gè)項(xiàng)目組在同一個(gè)調(diào)度的時(shí)候,同一個(gè)調(diào)度器上都是隔離的,一個(gè)項(xiàng)目組出問(wèn)題,不會(huì)影響到其他的項(xiàng)目組,這就相當(dāng)于代表了隔離性負(fù)載均衡
  • 負(fù)載均衡。調(diào)度中心調(diào)度任務(wù)的時(shí)候,任務(wù)的執(zhí)行周期時(shí)間不一樣,可能有的任務(wù)需要的時(shí)間長(zhǎng)一點(diǎn),有的任務(wù)需要的時(shí)間短一點(diǎn),調(diào)度器的資源也不太一樣,有的CPU高一點(diǎn),有的CPU低一點(diǎn),那如何保證調(diào)度負(fù)載均衡?如何保證資源隔離的負(fù)載均衡?我們會(huì)根據(jù)這種任務(wù)調(diào)度的歷史值(任務(wù)耗時(shí))以及機(jī)器本身性能的值進(jìn)行考量,使每一個(gè)任務(wù)調(diào)度中心擁有的調(diào)度數(shù)量差不多、消耗也差不多。這是一種新的負(fù)載,而不是簡(jiǎn)單的流量負(fù)載。

三、SIA-TASK組成模塊

3.1 首頁(yè)

任務(wù)調(diào)度管理首頁(yè)主要包括三部分:調(diào)度器信息、調(diào)度次數(shù)、對(duì)接項(xiàng)目詳情。

  • 調(diào)度器信息:調(diào)度中心調(diào)度器的數(shù)量。
  • 調(diào)度次數(shù):調(diào)度中心調(diào)度Job的歷史累計(jì)總數(shù)。
  • 對(duì)接項(xiàng)目詳情:調(diào)度中心對(duì)接的項(xiàng)目組總數(shù),Job總數(shù)。

目前SIA-Task平臺(tái)上已經(jīng)接入了51個(gè)項(xiàng)目,上面跑的Job數(shù)有600多個(gè),今年上線的版本,Job已經(jīng)跑了3000多萬(wàn)次。

調(diào)度器上有幾個(gè)值需要了解一下,每臺(tái)調(diào)度器都有三個(gè)指標(biāo)。

  • Job上限值:所能負(fù)載的Job動(dòng)態(tài)閾值;
  • Job運(yùn)行數(shù)量:該調(diào)度器當(dāng)前運(yùn)行的Job數(shù)量;
  • Job預(yù)警值:當(dāng)調(diào)度器運(yùn)行的Job數(shù)超過(guò)預(yù)警值時(shí),會(huì)發(fā)郵件通知管理員。

3.2 調(diào)度器管理

宜信微服務(wù)任務(wù)調(diào)度平臺(tái)建設(shè)實(shí)踐|分享實(shí)錄

關(guān)于調(diào)度器有幾個(gè) 信息需要了解,如圖所示,點(diǎn)擊某個(gè)調(diào)度器(柱狀圖),會(huì)顯示該調(diào)度器所搶占的Job詳情列表:

  • JobKey:所配置的Job名稱,每個(gè)Job都有自己的名字。
  • 類型:配置Job的定時(shí)任務(wù)類型,分為Cron與fixRate兩類。
  • Job類型值:如果是Cron表達(dá)式,6位時(shí)間戳怎么寫;如果是fixRate,那就是需要間隔多少時(shí)間。
  • 預(yù)警郵箱:該Job配置的預(yù)警郵箱。
  • 描述信息:描述該Job的功能信息,便于管理員能夠迅速發(fā)現(xiàn)某臺(tái)調(diào)度器所搶占的Job詳情。

調(diào)度器包括工作調(diào)度器、下線調(diào)度器、離線調(diào)度器、白名單。

  • 工作調(diào)度器:這類調(diào)度器具有搶占和調(diào)度Job的能力。對(duì)某調(diào)度器進(jìn)行下線操作,它會(huì)立即失去搶占Job的能力,已經(jīng)搶占的Job執(zhí)行完畢后會(huì)自動(dòng)釋放,進(jìn)而被其他調(diào)度器搶占,調(diào)度器下線后會(huì)進(jìn)入下線調(diào)度器列表中;工作調(diào)度器列表提供下線以及批量下線的功能。簡(jiǎn)單來(lái)說(shuō),工作調(diào)度器就是正在工作中的調(diào)度器。
  • 下線調(diào)度器:這類調(diào)度器進(jìn)程仍然存活,但失去了搶占Job與參與調(diào)度的能力。對(duì)這類調(diào)度器執(zhí)行上線操作,會(huì)進(jìn)入工作調(diào)度器列表,且開(kāi)始具有搶占和調(diào)度Job的能力;下線調(diào)度器列表提供上線及批量上線的功能。就是說(shuō),下線調(diào)度器依然活著,只是不再參與搶占Job,之前已經(jīng)有的Job還是會(huì)繼續(xù)執(zhí)行完成,如果點(diǎn)擊上線就重新具備搶占Job的能力,變成工作調(diào)度器。
  • 離線調(diào)度器:這類調(diào)度器進(jìn)程不再存活,當(dāng)下線調(diào)度器進(jìn)程死亡后,會(huì)自動(dòng)進(jìn)入離線調(diào)度器列表,這類調(diào)度器進(jìn)程重新啟動(dòng)后,會(huì)自動(dòng)進(jìn)入下線調(diào)度器列表;離線調(diào)度器列表也提供刪除及批量刪除的功能。離線調(diào)度器一般都是出現(xiàn)問(wèn)題了,可能是進(jìn)程掛掉了,也可能是網(wǎng)絡(luò)故障了。
  • 白名單:將某個(gè)IP加入白名單之后,它具有調(diào)用所有執(zhí)行器實(shí)例的權(quán)限;白名單列表提供批量刪除的功能,刪除該IP后自動(dòng)失去該權(quán)限。

3.3 調(diào)度監(jiān)控

宜信微服務(wù)任務(wù)調(diào)度平臺(tái)建設(shè)實(shí)踐|分享實(shí)錄

上圖所示是SIA-TASK的調(diào)度監(jiān)控頁(yè)面,分著的一塊一塊區(qū)域?qū)儆诓煌?xiàng)目組。目前SIA-Task接入了51個(gè)項(xiàng)目,準(zhǔn)備中的有500多個(gè),正在運(yùn)行的有25個(gè)。

有的Job執(zhí)行非???,幾秒鐘就執(zhí)行完了,有的Job執(zhí)行非常慢,需要很長(zhǎng)的時(shí)間,我們?cè)跔顟B(tài)抓取的時(shí)候,只能抓取到時(shí)間長(zhǎng)的Job,這些被抓取的Job顯示為正在運(yùn)行,而時(shí)間短的捕捉不到,但它們都處于執(zhí)行狀態(tài),這些沒(méi)有被抓取到的Job就顯示為準(zhǔn)備中。

可能有的Job這段時(shí)間不需要運(yùn)行,可以手動(dòng)停止,剩下的就是異常停止的Job,需要發(fā)送郵件告警。

我們也提供了檢索的能力,可以接受不同項(xiàng)目組登錄查詢自己的項(xiàng)目運(yùn)行狀態(tài)。

3.4 Task管理

Task管理界面中,Task按項(xiàng)目組分組顯示,主要提供Task的配置、修改與刪除等功能。Task包含兩部分:一部分Task使用了sia-Task-hunter組件,通過(guò)標(biāo)準(zhǔn)注解實(shí)現(xiàn)Task的自動(dòng)抓取,這類Task不允許修改;另外一部分Task是由用戶手動(dòng)添加的,我知道訪問(wèn)的URL和HTTP地址,手動(dòng)添加進(jìn)來(lái),這部分Task支持跨平臺(tái)的抓取,而且可以修改和刪除。

一個(gè)Task管理包含以下幾個(gè)部分內(nèi)容:項(xiàng)目名稱、應(yīng)用名稱、任務(wù)名稱、機(jī)器地址、描述、以及查看/修改/連通性測(cè)試等操作。同一個(gè)Task名稱,不同的機(jī)器地址,代表一個(gè)任務(wù)和不同的任務(wù)實(shí)例。

3.5 Job管理

宜信微服務(wù)任務(wù)調(diào)度平臺(tái)建設(shè)實(shí)踐|分享實(shí)錄

前面介紹了一個(gè)Job由若干個(gè)Task組成,圖中每一個(gè)不同的列代表項(xiàng)目名稱,點(diǎn)擊下拉列表可以顯示所有的項(xiàng)目,可以進(jìn)行過(guò)濾、添加、狀態(tài)查看等操作。

其中狀態(tài)操作可以手工執(zhí)行,可以停止或激活Job,Job配置好之后屬于未激活的狀態(tài),需要激活一下。還可以修改Job里的信息,配置Job等。
如何添加Job?假如我要添加一個(gè)Cron表達(dá)式類型的Job,需要添加哪些內(nèi)容呢?

因?yàn)镴ob是Cron表達(dá)式類型的,首先我需要輸入六位表達(dá)式內(nèi)容,還要添加一個(gè)預(yù)警郵箱,再描述這個(gè)Job,每個(gè)Job都有一個(gè)key,最后還需要添加Job_key。這樣一個(gè)新的Job就添加好了。

回過(guò)頭來(lái)看,添加Job需要配置Task信息,這是一個(gè)比較復(fù)雜的過(guò)程。一個(gè)Job由若干個(gè)Task組成,我們可以用拖拉拽的方式根據(jù)Task之間的關(guān)系確定形成組成Job的所有Task的順序關(guān)系。還可以以不同顏色代表不同項(xiàng)目進(jìn)行區(qū)分,當(dāng)然只有管理員才有權(quán)限看到所有項(xiàng)目,各個(gè)項(xiàng)目的負(fù)責(zé)人只能看到自己所屬項(xiàng)目的狀態(tài)。

上傳Task的時(shí)候會(huì)帶一些參數(shù),所以還涉及到參數(shù)的處理,比如參數(shù)類型、參數(shù)值、過(guò)期時(shí)間等。重點(diǎn)聊聊過(guò)期時(shí)間。

通過(guò)HTTP方式調(diào)用會(huì)遇到一個(gè)問(wèn)題:到底Task什么時(shí)間會(huì)執(zhí)行完成。為解決這個(gè)問(wèn)題,就需要設(shè)一個(gè)Task的過(guò)期時(shí)間,只要過(guò)期時(shí)間一到,就會(huì)轉(zhuǎn)入其他策略,比如放棄或人工處理等。因?yàn)樽鳛楫惒秸{(diào)用,不可能無(wú)休止地等待客戶端返回結(jié)果。

當(dāng)然也可能存在一種情況:我得到的結(jié)果是超時(shí)了,實(shí)際上任務(wù)是在正確執(zhí)行,而且再過(guò)一段時(shí)間給我返回結(jié)果了。我們?cè)?jīng)設(shè)計(jì)了一種隊(duì)列補(bǔ)償機(jī)制來(lái)處理這個(gè)問(wèn)題,但是好像意義不大。當(dāng)然,這只是一種可能,平臺(tái)上線至今沒(méi)有出現(xiàn)過(guò)。

目前平臺(tái)的Task_選取實(shí)例策略包括兩種:

  • 隨機(jī),從可選的列表中,隨機(jī)選擇實(shí)例,即IP+端口;
  • 固定IP,指定實(shí)例,隨后需要從可選列表中人工指定實(shí)例。
    平臺(tái)支持四種Task_調(diào)用失敗策略:
  • STOP,停止策略,調(diào)用失敗則整個(gè)Job停止,不再執(zhí)行后續(xù)Task;
  • IGNORE,忽略策略,調(diào)用失敗則跳過(guò)該Task,繼續(xù)執(zhí)行后續(xù)Task;
  • TRANSFER,轉(zhuǎn)移策略,選取該Task的其他實(shí)例執(zhí)行,如果依然失敗,則使用停止策略;
  • MULTI_CALLS_TRANSFER,多次調(diào)用再轉(zhuǎn)移策略,重復(fù)調(diào)用該Task多次,如果依然失敗,則使用轉(zhuǎn)移策略。

3.6 調(diào)度日志

日志管理提供了Job的運(yùn)行日志相關(guān)信息,按項(xiàng)目組分組顯示,一條Job日志的關(guān)鍵元素包含:

  • 執(zhí)行狀態(tài):表示該Job執(zhí)行結(jié)果;
  • 執(zhí)行時(shí)間:表示調(diào)度器調(diào)度Job的時(shí)間;
  • 執(zhí)行完成時(shí)間:表示Job執(zhí)行完成的時(shí)間;
  • 調(diào)度信息:表示執(zhí)行Job的調(diào)度器實(shí)例;
  • 執(zhí)行信息:Job執(zhí)行的具體信息,并且已實(shí)現(xiàn)Job與所引用的Task的執(zhí)行日志信息的關(guān)聯(lián),日志默認(rèn)保存七天。

四、開(kāi)源

SIA-TASK作為SIA團(tuán)隊(duì)的一個(gè)重要產(chǎn)品,在公司接入了數(shù)十個(gè)項(xiàng)目,運(yùn)行著數(shù)百個(gè)Job,經(jīng)受住了穩(wěn)定性的考驗(yàn)。

SIA-TASK微服務(wù)調(diào)度平臺(tái)于5月已經(jīng)開(kāi)源,開(kāi)源地址:https://github.com/siaorg/sia-Task,感興趣的同學(xué)可以登錄查看詳細(xì)介紹。

分享者:梁鑫

來(lái)源:宜信技術(shù)學(xué)院

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI