溫馨提示×

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

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

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

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

一、分布式任務(wù)調(diào)度的背景

無(wú)論是互聯(lián)網(wǎng)應(yīng)用或者企業(yè)級(jí)應(yīng)用,都充斥著大量的批處理任務(wù)。我們常常需要一些任務(wù)調(diào)度系統(tǒng)來(lái)幫助解決問(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)。

1.1 分布式任務(wù)調(diào)度的演進(jìn)

在實(shí)際業(yè)務(wù)開(kāi)發(fā)過(guò)程中,很多時(shí)候我們無(wú)可避免地需要使用一些定時(shí)任務(wù)來(lái)解決問(wèn)題。通常我們會(huì)有多種解決方案:使用 Crontab 或 SpringCron (當(dāng)然這種情況可能機(jī)器很少而且任務(wù)簡(jiǎn)單又不是很多的情況下)。然而,當(dāng)應(yīng)用復(fù)雜度升高、定時(shí)任務(wù)數(shù)量增多且任務(wù)之間產(chǎn)生依賴關(guān)系時(shí),Crontab 進(jìn)行定時(shí)任務(wù)的管理配置就會(huì)非?;靵y,嚴(yán)重影響工作效率。這時(shí)就會(huì)產(chǎn)生一系列問(wèn)題:

  • 任務(wù)管理混亂,生命周期無(wú)法統(tǒng)一協(xié)調(diào)管理;
  • 任務(wù)之間如果存在依賴關(guān)系,難以編排。

隨著互聯(lián)網(wǎng)的發(fā)展,分布式服務(wù)架構(gòu)勢(shì)越來(lái)越流行。相應(yīng)的也需要一個(gè)分布式任務(wù)調(diào)度系統(tǒng)來(lái)管理分布式架構(gòu)中的定時(shí)任務(wù)。

1.2 分布式任務(wù)調(diào)度架構(gòu)

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

當(dāng)垂直應(yīng)用越來(lái)越多,應(yīng)用之間交互也會(huì)越來(lái)越復(fù)雜,通常我們采用分布式或者微服務(wù)架構(gòu),將核心業(yè)務(wù)抽取出來(lái),形成單獨(dú)的服務(wù)。一個(gè)獨(dú)立的微服務(wù)群體逐漸形成穩(wěn)定的服務(wù)中心,使得業(yè)務(wù)應(yīng)用能更快地響應(yīng)多變的市場(chǎng)需求。

此時(shí),用于提高業(yè)務(wù)復(fù)用及整合的分布式服務(wù)框架成為關(guān)鍵。同時(shí),由于服務(wù)獨(dú)立,一般能做到定時(shí)任務(wù)獨(dú)立的情況,任務(wù)的更改對(duì)于整體系統(tǒng)的影響小之又小。通常我們會(huì)采用任務(wù)與調(diào)度分離的方式(如上圖所示),任務(wù)的執(zhí)行邏輯無(wú)需關(guān)注調(diào)度與編排,同時(shí)可以保證執(zhí)行器和調(diào)度的高可用,易于開(kāi)發(fā)和維護(hù)。

1.3 分布式任務(wù)調(diào)度優(yōu)勢(shì)

在分布式服務(wù)架構(gòu)的基礎(chǔ)上,由于獨(dú)立業(yè)務(wù)的數(shù)量可能很多,此時(shí)如果定時(shí)任務(wù)單獨(dú)在該服務(wù)中實(shí)現(xiàn),很可能會(huì)出現(xiàn)難以管理的情況,且避免不了由于定時(shí)任務(wù)的更改而導(dǎo)致的業(yè)務(wù)重啟。因此,一個(gè)獨(dú)立的分布式任務(wù)調(diào)度系統(tǒng)是很必要的,可以用來(lái)全局統(tǒng)籌管理所有的定時(shí)任務(wù)。同時(shí),將任務(wù)的配置單獨(dú)抽離出來(lái),作為該分布式任務(wù)調(diào)度系統(tǒng)的功能,就能做到定時(shí)任務(wù)的更改不影響任何業(yè)務(wù),也不影響整個(gè)系統(tǒng):

  • 通過(guò)調(diào)度與任務(wù)分離的方式進(jìn)行管理,大大降低了開(kāi)發(fā)和維護(hù)成本;
  • 分布式部署,保證了系統(tǒng)的高可用性、伸縮性、負(fù)載均衡,提高了容錯(cuò)性;
  • 可以通過(guò)控制臺(tái)部署和管理定時(shí)任務(wù),方便靈活高效;
  • 任務(wù)都可以持久化到數(shù)據(jù)庫(kù),避免了宕機(jī)和數(shù)據(jù)丟失帶來(lái)的隱患,同時(shí)有完善的任務(wù)失敗重做機(jī)制和詳細(xì)的任務(wù)跟蹤及告警策略。

二、分布式任務(wù)調(diào)度技術(shù)選型

2.1 分布式任務(wù)調(diào)度考慮因素

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

  • 任務(wù)編排:多個(gè)業(yè)務(wù)之間的定時(shí)任務(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í)行邏輯。
  • 故障轉(zhuǎn)移:任務(wù)執(zhí)行過(guò)程中遇到問(wèn)題有補(bǔ)償措施,減少人工介入。
  • 高可用:調(diào)度系統(tǒng)自身必須保證高可用。
  • 實(shí)時(shí)監(jiān)控:實(shí)時(shí)獲取任務(wù)的執(zhí)行狀態(tài)。
  • 可視化:任務(wù)調(diào)度的操作提供可視化頁(yè)面,方便使用。
  • 動(dòng)態(tài)編輯:業(yè)務(wù)的任務(wù)時(shí)鐘參數(shù)可能變動(dòng),不希望停機(jī)部署。

2.2 SIA-TASK與其它分布式任務(wù)調(diào)度技術(shù)比較

SIA是宜信公司基礎(chǔ)開(kāi)發(fā)平臺(tái)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)。

開(kāi)源地址:https://github.com/siaorg/sia-task

我們先對(duì)比市場(chǎng)上主流的開(kāi)源分布式任務(wù)調(diào)度框架,分析其優(yōu)缺點(diǎn),然后再介紹我們的技術(shù)選型。

  • Quartz: Quartz 是 OpenSymphony 開(kāi)源組織在任務(wù)調(diào)度領(lǐng)域的一個(gè)開(kāi)源項(xiàng)目,完全基于 Java 實(shí)現(xiàn)。該項(xiàng)目于 2009 年被 Terracotta 收購(gòu),目前是 Terracotta 旗下的一個(gè)項(xiàng)目。相比于 JDK 或 Spring 提供的定時(shí)任務(wù),Quartz 對(duì)單個(gè)任務(wù)的控制基本做到了極致,以其強(qiáng)大功能和應(yīng)用靈活性,在企業(yè)應(yīng)用中發(fā)揮了巨大的作用。然而 Quartz 并不支持任務(wù)的編排(任務(wù)之間有依賴),而且不支持任務(wù)分片。
  • TBSchedule: TBSchedule 是一個(gè)支持分布式的調(diào)度框架,能讓一種批量任務(wù)或者不斷變化的任務(wù),被動(dòng)態(tài)地分配到多個(gè)主機(jī)的 JVM 中,不同的線程組中并行執(zhí)行?;?ZooKeeper 的純 Java 實(shí)現(xiàn),由 Alibaba 開(kāi)源。TBSchedule 側(cè)重于任務(wù)的分發(fā),支持任務(wù)分片,但是沒(méi)有任務(wù)編排,也不是跨平臺(tái)的。
  • Elastic-Job: Elastic-Job 是當(dāng)當(dāng)開(kāi)源的一個(gè)分布式調(diào)度解決方案,由兩個(gè)相互獨(dú)立的子項(xiàng)目Elastic-Job-Lite 和 Elastic-Job-Cloud 組成。Elastic-Job 支持任務(wù)分片(作業(yè)分片一致性),但是沒(méi)有任務(wù)編排,也不是跨平臺(tái)的。
  • Saturn: Saturn 是唯品會(huì)開(kāi)源的分布式,高可用的調(diào)度服務(wù)。Saturn 在 Elastic-Job 做二次開(kāi)發(fā),支持監(jiān)控、任務(wù)分片、跨平臺(tái),但是沒(méi)有任務(wù)編排。
  • Antares: Antares 是基于 Quartz 的分布式調(diào)度,支持分片、支持樹(shù)形任務(wù)依賴,但不是跨平臺(tái)的。
  • Uncode-Schedule: Uncode-Schedule 是基于 Zookeeper 的分布式任務(wù)調(diào)度組件。支持所有任務(wù)在集群中不重復(fù)、不遺漏的執(zhí)行。支持動(dòng)態(tài)添加和刪除任務(wù)。但是不支持任務(wù)分片,也沒(méi)有任務(wù)編排,還不是跨平臺(tái)的。
  • XXL-JOB: XXL-JOB 是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度平臺(tái),其核心設(shè)計(jì)目標(biāo)是開(kāi)發(fā)迅速、學(xué)習(xí)簡(jiǎn)單、輕量級(jí)、易擴(kuò)展。XXL-JOB 支持分片,簡(jiǎn)單支持任務(wù)依賴,支持子任務(wù)依賴,不是跨平臺(tái)的。

下面我們簡(jiǎn)單對(duì)比下 SIA-TASK 與這些任務(wù)調(diào)度框架:

任務(wù)編排 任務(wù)分片 跨平臺(tái) 高可用 故障轉(zhuǎn)移 實(shí)時(shí)監(jiān)控
SIA-TASK
Quartz × × .NET × API監(jiān)控
TBSchedule × ×
Elastic-Job × ×
Saturn ×
Antares ×
Uncode-Schedule × × ×
XXL-JOB 子任務(wù)依賴 ×

可以發(fā)現(xiàn),這些調(diào)度框架基本上都支持高可用、故障轉(zhuǎn)移與實(shí)時(shí)監(jiān)控等功能,但是對(duì)于任務(wù)編排、任務(wù)分片與跨平臺(tái)等功能的支持各有側(cè)重點(diǎn)。SIA-TASK 將全面支持這些功能。

三、SIA-TASK介紹

3.1 SIA-TASK技術(shù)選型

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

  • REST:一種軟件架構(gòu)風(fēng)格。要求執(zhí)行器暴露 Http 調(diào)用接口來(lái)達(dá)到跨平臺(tái)的目的。
  • AOP:切面編程技術(shù)。在 Spring 項(xiàng)目擴(kuò)展包 Hunter 中使用,保證 Task 被串行調(diào)用(單例單線程)。
  • Quartz:功能強(qiáng)大,應(yīng)用靈活,對(duì)單個(gè)任務(wù)的控制基本做到了極致,用來(lái)作為調(diào)度中心時(shí)鐘組件。
  • MySQL:用于元數(shù)據(jù)存儲(chǔ)與(暫時(shí))日志存取。
  • Elastic:基于 Lucene 的搜索服務(wù)器,提供了一個(gè)分布式多用戶能力的全文搜索引擎,用于日志的存儲(chǔ)與查詢。
  • SpringCloud:社區(qū)活躍的開(kāi)發(fā)框架,也是公司指定的統(tǒng)一開(kāi)發(fā)框架。用于快速開(kāi)發(fā),快速迭代。
  • MyBatis:一款優(yōu)秀的持久層框架,支持定制化 SQL,存儲(chǔ)過(guò)程以及高級(jí)映射。用于簡(jiǎn)化持久層開(kāi)發(fā)。
  • Zookeeper:久經(jīng)考驗(yàn)的注冊(cè)中心。用來(lái)解決調(diào)度中心高可用,分布式一致性等問(wèn)題。

3.2 SIA-TASK設(shè)計(jì)思想

SIA-TASK借鑒微服務(wù)設(shè)計(jì)思想,獲取分布在每個(gè)執(zhí)行器節(jié)點(diǎn)上的任務(wù)(Task)元數(shù)據(jù),進(jìn)行匯報(bào),上傳注冊(cè)中心。利用在線可編輯方式支持任務(wù)在線編排、動(dòng)態(tài)修改任務(wù)時(shí)鐘;使用 Http 協(xié)議作為交互傳輸協(xié)議。數(shù)據(jù)交互格式統(tǒng)一使用Json。用戶通過(guò)編排器(下文會(huì)做介紹)進(jìn)行操作,觸發(fā)事件,調(diào)度器接收事件,由調(diào)度中心進(jìn)行時(shí)鐘解析,執(zhí)行任務(wù)流程,進(jìn)行任務(wù)通知。

3.3 SIA-TASK基本概念

SIA-TASK 采用任務(wù)和調(diào)度分離的方式,業(yè)務(wù)的執(zhí)行任務(wù)邏輯和調(diào)度邏輯完全分離。系統(tǒng)組成共涉及以下幾個(gè)核心概念:

  • 任務(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)求。
  • 任務(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編寫(xiě)。

3.4 SIA-TASK系統(tǒng)架構(gòu)

SIA-TASK 可以分為三大模塊(調(diào)度中心、編排中心和執(zhí)行器)、兩大組件(持久化存儲(chǔ)和注冊(cè)中心)。這三大模塊和兩大組件的作用如下:

  • 任務(wù)調(diào)度中心:負(fù)責(zé)搶占Job和任務(wù)調(diào)度以及任務(wù)遷移等,是SIA-TASK 的核心功能模塊。
  • 任務(wù)編排中心:負(fù)責(zé)對(duì)在線任務(wù)進(jìn)行邏輯編排,提供日志查看和實(shí)時(shí)監(jiān)控功能。
  • 任務(wù)執(zhí)行器:負(fù)責(zé)接收調(diào)度請(qǐng)求并執(zhí)行任務(wù)邏輯。
  • 任務(wù)注冊(cè)中心(ZK):協(xié)調(diào)Job和Task、調(diào)度器等的工作流程。
  • 持久化存儲(chǔ)(DB):記錄項(xiàng)目的Job和Task數(shù)據(jù),并提供日志存儲(chǔ)。

SIA-TASK 使用 SpringBoot 體系作為架構(gòu)選型,基于Quartz及Zookeeper進(jìn)行二次開(kāi)發(fā),支持相應(yīng)的特×××,SIA-TASK 的邏輯架構(gòu)圖如下圖所示:

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

3.5 SIA-TASK模塊說(shuō)明

3.5.1 任務(wù)調(diào)度中心

任務(wù)調(diào)度中心負(fù)責(zé)任務(wù)調(diào)度,管理調(diào)度信息,按照調(diào)度配置發(fā)出調(diào)度請(qǐng)求,自身不承擔(dān)業(yè)務(wù)代碼。調(diào)度系統(tǒng)與任務(wù)解耦,提高了系統(tǒng)可用性和穩(wěn)定性,同時(shí)調(diào)度系統(tǒng)性能不再受限于任務(wù)模塊;支持可視化、簡(jiǎn)單且動(dòng)態(tài)地管理調(diào)度信息,包括任務(wù)新建,更新,刪除和任務(wù)報(bào)警等,所有上述操作都會(huì)實(shí)時(shí)生效,同時(shí)支持監(jiān)控調(diào)度結(jié)果以及執(zhí)行日志,支持執(zhí)行器故障恢復(fù)。

3.5.2 任務(wù)編排中心

任務(wù)編排中心是分布式調(diào)度中心支持在線任務(wù)模型編排的組件;依托于UI可進(jìn)行web端任務(wù)編排。

我們可以通過(guò)上述基礎(chǔ)模型來(lái)編排一些復(fù)雜的調(diào)度模型,例如:

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

SIA-TASK的UI編排界面:

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

編排結(jié)束后查看task的編排信息如下圖所示:

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

同時(shí),編排中心還提供首頁(yè)統(tǒng)計(jì)數(shù)據(jù)查看、調(diào)度監(jiān)控、Job管理、Task管理以及日志管理功能。

3.5.3 任務(wù)執(zhí)行器

負(fù)責(zé)接收調(diào)度請(qǐng)求并執(zhí)行任務(wù)邏輯。任務(wù)模塊專注于任務(wù)的執(zhí)行等操作,開(kāi)發(fā)和維護(hù)更加簡(jiǎn)單和高效;

執(zhí)行器支持兩種類型:

(1) 如果使用 sia-task-hunter,支持SpringBoot項(xiàng)目和Spring項(xiàng)目, 引入 sia-task-hunter,任務(wù)(Task)抓取客戶端。合規(guī)的HTTP接口(稱之為T(mén)ask)任務(wù)會(huì)自動(dòng)被抓取并上傳注冊(cè)中心;

(2) 如果不使用 sia-task-hunter,只需提供任務(wù)可調(diào)用的HTTP接口,此時(shí)需要業(yè)務(wù)手動(dòng)錄入,且自行控制該任務(wù)的并發(fā)調(diào)用控制。

3.5.4 任務(wù)注冊(cè)中心(Zookeeper)

分布式框架采用Zookeeper作為注冊(cè)中心。

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

(1) 任務(wù)注冊(cè)

調(diào)度中心和執(zhí)行集群都以Zookeeper作為注冊(cè)中心,所有數(shù)據(jù)以節(jié)點(diǎn)及節(jié)點(diǎn)內(nèi)容的形式注冊(cè),通過(guò)定時(shí)匯報(bào)主機(jī)狀態(tài)保持存活在Zookeeper上。

(2) 元數(shù)據(jù)存儲(chǔ)

注冊(cè)中心不僅僅提供注冊(cè)服務(wù),并且存儲(chǔ)每個(gè)執(zhí)行器的信息(包括執(zhí)行器實(shí)例信息,執(zhí)行器上傳的Task元數(shù)據(jù),以及任務(wù)運(yùn)行時(shí)的一些臨時(shí)狀態(tài)數(shù)據(jù))。

(3) 事件發(fā)布

基于Zookeeper事件推送機(jī)制,進(jìn)行任務(wù)的發(fā)布,通過(guò)平衡算法保證調(diào)度器任務(wù)搶占的分布均衡。

(4) 負(fù)載均衡

保證調(diào)度器獲取執(zhí)行Job的個(gè)數(shù)均衡,避免單一節(jié)點(diǎn)壓力。

3.5.5 持久化存儲(chǔ)(DB)

這里采用MySQL作為數(shù)據(jù)持久化解決方案。

除了Task動(dòng)態(tài)元數(shù)據(jù)保存在注冊(cè)中心之外,其他相關(guān)的元數(shù)據(jù)都存入MySQL,包括但不限于:手動(dòng)錄入的Task、配置的Job信息、編排的Task依賴信息、調(diào)度日志、業(yè)務(wù)人員操作日志、Task執(zhí)行日志等。

3.6 SIA-TASK關(guān)鍵運(yùn)行流程

3.6.1 任務(wù)發(fā)布流程

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

(1) 用戶可以通過(guò)UI進(jìn)行Job創(chuàng)建??梢赃x擇Job類型,設(shè)置預(yù)警郵箱,設(shè)置Job描述。然后為創(chuàng)建的Job進(jìn)行任務(wù)Task編排。

(2) Job創(chuàng)建完畢并且設(shè)置Task編排關(guān)系后可進(jìn)行任務(wù)發(fā)布,通過(guò)UI對(duì)相應(yīng)的Job進(jìn)行操作(激活,執(zhí)行一次,停止以及刪除操作)。

(3) 用戶的Task任務(wù)可以是通過(guò)抓取器抓取的,亦可以使用UI手動(dòng)創(chuàng)建。

3.6.2 執(zhí)行流程

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

(1) Job創(chuàng)建完成之后,可以選擇激活觸發(fā)定時(shí)任務(wù);

(2) Job到達(dá)預(yù)訂時(shí)間后,調(diào)度中心觸發(fā)Job,然后按照預(yù)定的Task編排邏輯通過(guò)http通知Task執(zhí)行器進(jìn)行執(zhí)行,并異步監(jiān)聽(tīng)任務(wù)執(zhí)行結(jié)果;

(3) 若執(zhí)行結(jié)果成功,則判斷是否存在后置Task,若存在,則繼續(xù)下一次調(diào)度,若不存在,則說(shuō)明該Job執(zhí)行完畢,結(jié)束本次調(diào)用;若執(zhí)行結(jié)果失敗,則觸發(fā)故障恢復(fù)策略:立即停止、忽略本次失敗、多次嘗試、轉(zhuǎn)到其它執(zhí)行器執(zhí)行。

3.6.3 狀態(tài)流轉(zhuǎn)

Job在整個(gè)生命周期內(nèi)存在四種狀態(tài),分別是:已停止(NULL)、準(zhǔn)備中(READY)、開(kāi)始運(yùn)行(RUNNING)、異常停止(STOP),狀態(tài)流轉(zhuǎn)及流轉(zhuǎn)條件如下圖所示。

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

3.7 SIA-TASK模塊設(shè)計(jì)

SIA-TASK 的物理網(wǎng)絡(luò)拓?fù)鋱D如下所示:

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

SIA-TASK 的模塊間交互設(shè)計(jì)思路:

(1) 通過(guò)編排中心創(chuàng)建Task任務(wù)或通過(guò)Hunter自動(dòng)抓取,并將 Task 信息異步保存到DB;創(chuàng)建Job并激活,在zookeeper中創(chuàng)建JobKey。

(2) 調(diào)度中心會(huì)監(jiān)聽(tīng)zookeeper中JobKey創(chuàng)建事件,然后搶占創(chuàng)建的Job,搶占成功后加入quartz定時(shí)任務(wù),當(dāng)時(shí)間到達(dá)即觸發(fā)Job運(yùn)行。調(diào)度中心異步調(diào)用執(zhí)行器服務(wù)執(zhí)行Job中的 Task (可能存在多個(gè) Task ,遵循 Task 失敗策略),并將結(jié)果返回到調(diào)度中心。

(3) 將Job執(zhí)行狀態(tài)隨時(shí)在zookeeper上更改,通過(guò)編排中心的查詢接口可以進(jìn)行查詢。

(4) Job執(zhí)行結(jié)束后,等待下一次執(zhí)行。

3.7.1 任務(wù)編排中心設(shè)計(jì)

編排中心可以與DB和zookeeper進(jìn)行數(shù)據(jù)交互,其主要功能可分為三方面:

  • 數(shù)據(jù)持久化接口服務(wù);
  • zookeeper上元數(shù)據(jù)變更;
  • 數(shù)據(jù)可視化:查看系統(tǒng)各種統(tǒng)計(jì)數(shù)據(jù)等。

編排中心首頁(yè)監(jiān)控展示如下:

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

3.7.2 任務(wù)調(diào)度中心設(shè)計(jì)

調(diào)度中心主要與DB、ZK和執(zhí)行器進(jìn)行交互,其主要功能可分為以下幾個(gè)方面:

  • Job執(zhí)行日志記錄
  • ZK中Job狀態(tài)變更
  • 調(diào)用執(zhí)行器服務(wù)執(zhí)行Job
  • 調(diào)度中心高可用
  • Job 調(diào)度線程池
3.7.3 任務(wù)執(zhí)行器設(shè)計(jì)

執(zhí)行器可以與ZK和調(diào)度中心進(jìn)行交互,其主要功能可分為兩個(gè)方面:

  • 接受調(diào)度中心的調(diào)度,執(zhí)行定時(shí)任務(wù),并將結(jié)果返回到調(diào)度中心;
  • 自動(dòng)抓取執(zhí)行器上的 Task 任務(wù),提交到ZK。

執(zhí)行器 Task示例:

@OnlineTask(description = "在線任務(wù)示例",enableSerial=true)
@RequestMapping(value = "/example", method = { RequestMethod.POST }, produces = "application/json;charset=UTF-8")
@CrossOrigin(methods = { RequestMethod.POST }, origins = "*")
@ResponseBody
public String example(@RequestBody String json) {   
    /**
     * TODO:客戶端業(yè)務(wù)邏輯處理
     */
    Map<String, String> info = new HashMap<String, String>();
    info.put("status", "success");
    info.put("result", "as you need");
    return JSONHelper.toString(info);
}

由此可見(jiàn),任務(wù) Task 編寫(xiě)非常簡(jiǎn)單。

3.8 SIA-TASK高可用設(shè)計(jì)

分布式服務(wù)一般都要考慮高可用方案,同樣 SIA-TASK 為了保證高可用,針對(duì)不同的服務(wù)組件進(jìn)行了不同維度增強(qiáng)。

3.8.1 任務(wù)編排中心的高可用

SIA-TASK 通過(guò)前后端分離、服務(wù)拆分等措施實(shí)現(xiàn)了編排中心的高可用。當(dāng)集群中某實(shí)例失效后,不會(huì)影響集群的其它實(shí)例,因此無(wú)需特殊操作即可使用集群中其它的可用編排中心。

3.8.2 任務(wù)調(diào)度中心的高可用
3.8.2.1 異常轉(zhuǎn)移

如果調(diào)度中心集群中的某個(gè)實(shí)例節(jié)點(diǎn)服務(wù)宕機(jī)后,這個(gè)實(shí)例節(jié)點(diǎn)上的所有Job會(huì)平滑遷移到集群中可用的實(shí)例上,不會(huì)造成定時(shí)任務(wù)的執(zhí)行缺失,同時(shí),當(dāng)崩潰后的實(shí)例修復(fù)成功重新接入該集群時(shí),會(huì)繼續(xù)搶占Job提供服務(wù)。

3.8.2.2 配置線程池

調(diào)度采用線程池方式實(shí)現(xiàn),避免單線程因阻塞而引起任務(wù)調(diào)度延遲。程池里的線程數(shù),默認(rèn)值是10,當(dāng)執(zhí)行任務(wù)會(huì)并發(fā)執(zhí)行多個(gè)耗時(shí)任務(wù)時(shí),要根據(jù)業(yè)務(wù)特點(diǎn)選擇線程池的大小。

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 60
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

SIA-TASK 根據(jù)quartz自身提供的threadPool再次進(jìn)行線程池的利用。進(jìn)行線程池重新定義,針對(duì)每個(gè)Job去分配一個(gè)獨(dú)有的線程池。線程池的大小可根據(jù)Job自身編排的 Task 個(gè)數(shù)的大小進(jìn)行動(dòng)態(tài)伸縮,從而保證每個(gè)Job的調(diào)度線程完全獨(dú)立,不在會(huì)因?yàn)榫幣?Task 個(gè)數(shù)的陡增而耗盡線程資源。同時(shí)提供線程池資源的回收邏輯,在Job進(jìn)行永久性終止時(shí)回收為期分配的線程池資源。

public static ExecutorService getExecutorService(String JobKey) {

    ExecutorService exec = executorPool.get(JobKey);
     if (exec == null) {
        LOGGER.info(Constants.LOG_PREFIX + "Initialize thread pool for running Jobs,Job is {}",JobKey);
      exec = Executors.newCachedThreadPool();
      executorPool.putIfAbsent(JobKey, exec);
      exec = executorPool.get(JobKey);
  }
    return exec;
}
3.8.2.3 全日志跟蹤

SIA-TASK 針對(duì)Job的整個(gè)調(diào)度生命周期進(jìn)行全面跟蹤,利用AOP進(jìn)行日志增強(qiáng),調(diào)度中心每觸發(fā)一次Job調(diào)度就會(huì)進(jìn)行日志記錄。同時(shí)針對(duì)Job編排的 Task 執(zhí)行也會(huì)進(jìn)行記錄任務(wù)日志。

日志分為Job日志和 Task 日志:

  • Job日志:包含調(diào)度器信息、調(diào)度時(shí)間、調(diào)度狀態(tài)以及其他附加屬性。
  • Task日志:包含執(zhí)行器信息、執(zhí)行時(shí)間、執(zhí)行狀態(tài)、返回信息以及其他附加屬性。
3.8.2.4 異步封裝
  • SIA-TASK 從一開(kāi)始設(shè)計(jì)就考慮了任務(wù)進(jìn)行遠(yuǎn)程調(diào)用對(duì)調(diào)度中心并發(fā)線程資源的損耗。對(duì)于Job封裝的 Task 遠(yuǎn)程調(diào)度,全部采用異步調(diào)用,每次任務(wù)請(qǐng)求邏輯的耗時(shí)非常的輕量化。只僅僅一次見(jiàn)到的http請(qǐng)求。
  • 支持 Task 進(jìn)行用戶自定義超時(shí)設(shè)置,支持兩種模式的超時(shí):connecttimeout、readtimeout。支持用戶根據(jù)業(yè)務(wù)的具體執(zhí)行周期來(lái)進(jìn)行超時(shí)設(shè)置。
public interface RestTemplate {

/**
 * 異步Post方法 * @param request
 * @param responseType
 * @param uriVariables
 * @param <T>
 * @return
 */
 <T> ListenableFuture<ResponseEntity<T>> postAsyncForEntity(Request request, Class<T> responseType, Object... uriVariables); }
3.8.2.5 自定義調(diào)度器資源池

宜信開(kāi)源|分布式任務(wù)調(diào)度平臺(tái)SIA-TASK的架構(gòu)設(shè)計(jì)與運(yùn)行流程

SIA-TASK 從物理資源角度設(shè)計(jì)了調(diào)度資源池,出于一些特殊情況的考量我們針對(duì)調(diào)度器進(jìn)行了池化;調(diào)度器可以通過(guò)不同的操作進(jìn)行狀態(tài)的轉(zhuǎn)變,從而進(jìn)行能力的轉(zhuǎn)化。

  • 工作調(diào)度器資源池:管理具備獲取任務(wù)能力并且可以實(shí)際獲取任務(wù)的調(diào)度器資源。
  • 下線調(diào)度器資源池:管理具備獲取任務(wù)能力但是實(shí)際不允許獲取的調(diào)度器資源。
  • 離線調(diào)度器資源池:管理下線調(diào)度器資源池中已經(jīng)宕機(jī)的調(diào)度器資源。
3.8.3 任務(wù)執(zhí)行器的高可用
  • 考慮網(wǎng)絡(luò)的不穩(wěn)定性,SIA-TASK 針對(duì)網(wǎng)絡(luò)的不穩(wěn)定性也做出了非常重要的設(shè)計(jì),對(duì)于節(jié)點(diǎn)的連通性的測(cè)試支持以及針對(duì) Task 運(yùn)行實(shí)例節(jié)點(diǎn)健康的預(yù)感知,保證提前感知 Task 實(shí)例節(jié)點(diǎn)的健康情況,保證調(diào)度 Task 高可用。

  • 同時(shí)也保證了執(zhí)行器實(shí)例針對(duì)網(wǎng)絡(luò)導(dǎo)致鏈接中斷的問(wèn)題,SIA-TASK 重新設(shè)計(jì)了zookeeper的重連機(jī)制,保證 Task 運(yùn)行實(shí)例節(jié)點(diǎn)因網(wǎng)絡(luò)問(wèn)題丟失鏈接后還能進(jìn)行恢復(fù)重試,直到恢復(fù)正常后并入執(zhí)行池中正常接收任務(wù)的調(diào)度。

  • 一般來(lái)說(shuō),執(zhí)行器也是集群部署的。作為 Task 的執(zhí)行單元,如果在執(zhí)行器集群中一臺(tái)機(jī)器上執(zhí)行失敗,調(diào)度中心會(huì)根據(jù)失敗策略來(lái)做故障轉(zhuǎn)移。這里提供了兩種故障轉(zhuǎn)移策略:輪詢轉(zhuǎn)移和最大補(bǔ)償轉(zhuǎn)移。輪詢轉(zhuǎn)移為對(duì)可用的執(zhí)行器列表進(jìn)行輪詢,若有一個(gè)執(zhí)行器執(zhí)行成功,則 Task 執(zhí)行成功,若全部執(zhí)行失敗,則 Task 執(zhí)行失敗。最大補(bǔ)償轉(zhuǎn)移為首先在本執(zhí)行器再次執(zhí)行若干次,若執(zhí)行成功,則不會(huì)轉(zhuǎn)移,若還是執(zhí)行失敗,則執(zhí)行輪詢轉(zhuǎn)移策略。

四、總結(jié)

至此對(duì)微服務(wù)任務(wù)調(diào)度平臺(tái) SIA-TASK 做了一個(gè)簡(jiǎn)要的介紹,包括設(shè)計(jì)背景、架構(gòu)設(shè)計(jì)以及產(chǎn)品組件功能與特性。微服務(wù)任務(wù)調(diào)度平臺(tái) SIA-TASK 基本上解決了當(dāng)前的業(yè)務(wù)需求,提供簡(jiǎn)單高效的編排調(diào)度服務(wù)。SIA-TASK 會(huì)持續(xù)迭代,提供更為完善的服務(wù)。之后也會(huì)提供相關(guān)技術(shù)文檔和使用文檔。

鏈接指南

開(kāi)源地址:https://github.com/siaorg/sia-task

拓展閱讀:宜信開(kāi)源微服務(wù)任務(wù)調(diào)度平臺(tái)(SIA-TASK)

作者:毛正衛(wèi)/×××飛/梁鑫

原文首發(fā):SpringCloud社區(qū)

向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