1.寫(xiě)在前面

1.1需求來(lái)源

最近有一個(gè)需求,假設(shè)我們有很多任務(wù)需要定時(shí)執(zhí)行甚至定時(shí)重復(fù)運(yùn)行,并且其中有一些任務(wù)之間可能存在控制依賴和/或數(shù)據(jù)依賴,甚至我們希望可以利用一些原子任務(wù)去組成一個(gè)更大的任務(wù)。

所以我們需要有一個(gè)工具可以將這些任務(wù)管理起來(lái):1)解決依賴問(wèn)題;2)將能并發(fā)的任務(wù)最大化地并發(fā)起來(lái);3)使用簡(jiǎn)單,只需填寫(xiě)配置文件,不需要寫(xiě)任何代碼即可讓一堆任務(wù)有序地Run起來(lái);4)能夠正確調(diào)度這些任務(wù)的順序;5)may be more。

我調(diào)研了一些已經(jīng)存在的任務(wù)執(zhí)行引擎,包括FStack。然而試用了一下FStack,發(fā)現(xiàn)我不會(huì)用,這就很尷尬了。
報(bào)著“殺雞焉用牛刀”的想法,于是最終花了幾天自己寫(xiě)了一個(gè)可實(shí)際運(yùn)行的工具,即panguan(判官)。

1.2名字來(lái)源

這個(gè)任務(wù)執(zhí)行引擎被命名為“判官”,就是想給人一種不明覺(jué)厲的裝X氣質(zhì)。

據(jù)百度百科記載,傳說(shuō)中陰曹地府中的判官判處人的輪回生死,對(duì)壞人進(jìn)行懲罰,對(duì)好人進(jìn)行獎(jiǎng)勵(lì)。而該任務(wù)執(zhí)行引擎的主要工作是調(diào)度任務(wù)的順序和生存周期,對(duì)執(zhí)行成功和失敗的任務(wù)進(jìn)行處理。感覺(jué)這個(gè)名字很有這個(gè)場(chǎng)景的氣質(zhì),于是配置任務(wù)屬性的配置文件就順便被命名為shengsibu.xml了。

1.3目前支持的特性

  1. 通過(guò)XML文件配置任務(wù)。
  2. 支持多任務(wù)同時(shí)運(yùn)行并且互不干擾。
  3. 支持單個(gè)任務(wù)由多個(gè)存在數(shù)據(jù)依賴和控制依賴或者可以并行執(zhí)行的子任務(wù)組成。子任務(wù)可以繼續(xù)由多個(gè)子任務(wù)組成,由此可以遞歸成為一棵復(fù)雜的任務(wù)樹(shù)。
  4. 能夠調(diào)度各種復(fù)雜的任務(wù)場(chǎng)景的任務(wù)的順序,使其并發(fā)最大化。
  5. 支持立即執(zhí)行、定時(shí)和重復(fù)執(zhí)行。
  6. 對(duì)任務(wù)進(jìn)行超時(shí)檢測(cè)。
  7. 展示每一個(gè)任務(wù)的當(dāng)前任務(wù)狀態(tài)和運(yùn)行時(shí)間。
  8. 支持原子任務(wù)去調(diào)用python和shell的腳本。另外可以不實(shí)際去執(zhí)行腳本而讓程序模擬結(jié)果,目前返回時(shí)間是二項(xiàng)分布~(100,0.05)的隨機(jī)結(jié)果,是否執(zhí)行成功是p為0.88的伯努利分布的隨機(jī)結(jié)果。

2.工程實(shí)踐

以下主要簡(jiǎn)要介紹一些實(shí)踐中的想法和思路。

2.1異步引擎加線程池

為了支持定時(shí)機(jī)制、多任務(wù)、任務(wù)組裝、任務(wù)依賴等特性,同步的做法顯得力不從心,當(dāng)然也可能是我水平差導(dǎo)致寫(xiě)不出來(lái)。于是在這里優(yōu)先采用了異步引擎加線程池的方案。相對(duì)于同步的做法,異步的做法開(kāi)銷更?。蝗欢鴷?huì)導(dǎo)致程序的實(shí)現(xiàn)難度增加,也更加難以理解。

我們需要:1)一個(gè)異步引擎;2)兩個(gè)不同方向的線程安全的消息隊(duì)列,一個(gè)是請(qǐng)求MQ,一個(gè)是返回MQ;3)一個(gè)工作線程池。
異步引擎將每個(gè)原子任務(wù)派發(fā)到請(qǐng)求MQ中,線程中的工作線程監(jiān)聽(tīng)請(qǐng)求MQ,執(zhí)行完后插入另一個(gè)返回MQ中。異步引擎從返回取回結(jié)果。

如下圖所示。

我們可以繼續(xù)推廣至一個(gè)多機(jī)的版本,如下圖。

Agent同時(shí)監(jiān)聽(tīng)兩個(gè)消息隊(duì)列(一個(gè)自身的MQ和一個(gè)Center的請(qǐng)求MQ):Agent從Center拉取消息的模式,可以自動(dòng)實(shí)現(xiàn)負(fù)載均衡;Center推給Agent的模式,可以指定將任務(wù)派發(fā)至某個(gè)機(jī)器,以此提高執(zhí)行效率。原因可能是這個(gè)任務(wù)距離數(shù)據(jù)目標(biāo)端的物理距離更近。

2.2對(duì)任務(wù)進(jìn)行抽象

2.2.1使用DAG去定義