工作流引擎在有贊 DevOps 中的實(shí)踐

一、 背景

隨著有贊規(guī)模的增長(zhǎng), 運(yùn)維的事務(wù)也日益復(fù)雜, 如何能更加高效的協(xié)調(diào)好開(kāi)發(fā), 運(yùn)維, 工具與流程之間的關(guān)系, 把運(yùn)維人員從低效率, 高強(qiáng)度, 易犯錯(cuò)的人工操作中徹底解放出來(lái)彰触,讓他們的能力與精力有更大程度的發(fā)揮, 是一個(gè)很大的挑戰(zhàn).

有贊 DevOps 平臺(tái)的工作流引擎 Opsflow 經(jīng)過(guò)兩年時(shí)間的演進(jìn), 從最開(kāi)始的僅支持簡(jiǎn)易的固定順序加定制腳本的系統(tǒng), 慢慢演化到可以通過(guò) GUI 操作的, 無(wú)需編碼的, 高度定制化的, 可視化的, 可感知進(jìn)度的工作流引擎, 支撐著每天數(shù)百上千的包括但不限于各種權(quán)限申請(qǐng), 應(yīng)用組件申請(qǐng), 大數(shù)據(jù)相關(guān)審批, 發(fā)布審批, 持續(xù)集成與交付等千差萬(wàn)別的流程.

本文將從以下幾個(gè)主要方面分別闡述有贊 DevOps 工作流引擎 Opsflow 的建設(shè)與演進(jìn):

在 Opsflow 完善之前面臨一系列的問(wèn)題:

  1. 流程的可定制化程度低
  2. 卷入流程的人無(wú)法感知一個(gè)流程的進(jìn)度
  3. 無(wú)法可視化流程, 需要人肉檢查配置, 容易出錯(cuò)
  4. 前端可定制程度低
  5. 各種審批流程分散在不同的應(yīng)用中, 重復(fù)造輪子
  6. 不支持動(dòng)態(tài)確定流程分支
  7. 老系統(tǒng)無(wú)法處理審批人請(qǐng)假等問(wèn)題
  8. 參與人類型支持缺乏
  9. 新流程接入成本高
  10. 無(wú)集中的統(tǒng)計(jì)報(bào)表, 較難感知運(yùn)營(yíng)情況
  11. ...

Opsflow 的系統(tǒng)設(shè)計(jì)以及在有贊的落地情況, 內(nèi)容包括:

  1. Opsflow 系統(tǒng)設(shè)計(jì)
  2. 目前在有贊 DevOps 平臺(tái)的落地現(xiàn)狀
  3. Roadmap

二、 工作流引擎設(shè)計(jì)

2.1 架構(gòu)設(shè)計(jì)

Opsflow 的實(shí)現(xiàn)由管理有限狀態(tài)機(jī)的 Opsflow-FSM 模塊, 與外界交互的 Opsflow-Web 模塊, 驅(qū)動(dòng)插件的 Opsflow-Plugins 模塊和執(zhí)行具體任務(wù)的 Worker 模塊和用來(lái)監(jiān)控任務(wù)消費(fèi)情況的監(jiān)控模塊組成, 下文逐一對(duì)這些模塊進(jìn)行介紹.

2.1.1 Opsflow-FSM

截止本文發(fā)布, 有贊 DevOps 平臺(tái)已有 60+ 流程接入 Opsflow, 每個(gè)流程在 Opsflow 看來(lái)上都是一個(gè)有限狀態(tài)機(jī) ( Finite-state machine ), 當(dāng)管理員在 Opsflow 管理后臺(tái)通過(guò) GUI 界面生成一個(gè)新流程, 本質(zhì)上是在 Opsflow 上創(chuàng)建了一個(gè)新的 FSM, 例如下圖的 "新建 ES 申請(qǐng)" 就是一個(gè) Opsflow-FSM 管理的一個(gè) FSM. Opsflow-FSM 作為 Opsflow 的核心, 驅(qū)動(dòng)工單往前推進(jìn), 例如, 當(dāng)一個(gè) "新建 ES 申請(qǐng)" 工單運(yùn)行到 "ES 管理員審批" 狀態(tài)時(shí), Opsflow-FSM 通過(guò)持久化在 RDS 中的工單實(shí)例可以得到當(dāng)前審批人可以觸發(fā)的三個(gè)流轉(zhuǎn) "同意" / "駁回" / "關(guān)閉工單", 任何一個(gè)流轉(zhuǎn)通過(guò)頁(yè)面被觸發(fā)之后又由 Opsflow-FSM 驅(qū)動(dòng)至 "審批駁回腳本執(zhí)行" / "審批完成腳本執(zhí)行" / "審批拒絕腳本執(zhí)行" 狀態(tài)之一, 以此類推, 最終 Opsflow-FSM 驅(qū)動(dòng)工單 ( 也即特定 FSM 的實(shí)例 ) 至 "結(jié)束" 狀態(tài), 完成一個(gè)工單的生命周期.

2.1.2 Opsflow-Web

Opsflow-FSM 僅僅對(duì) FSM 進(jìn)行管理, 無(wú)法與外界交互, Opsflow-Web 則封裝了 Opsflow-FSM, 增加了權(quán)限驗(yàn)證 ( 某個(gè)人是否有權(quán)限處理特定工單, 某個(gè)應(yīng)用是否可以操作某類工作流 ( FSM ) 等 ) 等模塊, 以 RESTful API 的方式對(duì)外界提供服務(wù), 與有贊 DevOps 平臺(tái)下的其他各個(gè)系統(tǒng)(發(fā)布系統(tǒng), CI & CD 系統(tǒng), 水位系統(tǒng)等 ) 進(jìn)行交互. 以前文的 "新建 ES 申請(qǐng)" 流程為例, 工單在 "ES 管理員審批" 節(jié)點(diǎn)時(shí) Opsflow-Web 根據(jù) Opsflow-FSM 給到的三個(gè)流轉(zhuǎn)信息在前端渲染出相應(yīng)的三個(gè)按鈕, 審批人按下其中一個(gè)按鈕之后, 動(dòng)作又由 Opsflow-Web 提供的 RESFful API 與前端交互, 觸發(fā) Opsflow-FSM 將 FSM 實(shí)例往相應(yīng)的分支進(jìn)行流轉(zhuǎn), FSM 向著 "結(jié)束" 狀態(tài)推進(jìn).

2.1.3 Opsflow-Plugins

基于可擴(kuò)展性的考慮, Opsflow 提供插件系統(tǒng) Opsflow-Plugins, 插件系統(tǒng)發(fā)送 Opsflow-FSM 在 FSM 在不同狀態(tài)間流轉(zhuǎn)的過(guò)程中的各種事件, 例如, "工單設(shè)置了新的參與人" 事件, 得益于 Opsflow-Plugins, 運(yùn)維開(kāi)發(fā)同學(xué)一旦接到諸如 "在工單設(shè)置新的參與人的時(shí)候通知一下 xxx" 等需求的時(shí)候, 實(shí)現(xiàn)起來(lái)不費(fèi)吹灰之力, 只需要提供一個(gè)實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單的插件即可, 具體來(lái)說(shuō)就是訂閱相應(yīng)事件, 提供回調(diào)接口即可. 目前有企業(yè)微信通知, Ops 待辦事項(xiàng)等插件通過(guò) Opsflow-Plugins 接入 Opsflow, 在保持 Opsflow 核心精簡(jiǎn)的同時(shí)豐富了 Opsflow 的功能.

2.1.4 Worker

工單經(jīng)過(guò)審批節(jié)點(diǎn)后通常會(huì)流轉(zhuǎn)到狀態(tài)機(jī)中設(shè)定好的 "腳本" 節(jié)點(diǎn) ( 節(jié)點(diǎn)的參與人屬性是 "腳本" 的 FSM 節(jié)點(diǎn) ), Opsflow-Web 將會(huì)推送相應(yīng)的任務(wù) ( 例如前文 "新建 ES 申請(qǐng)" 流程的具體負(fù)責(zé)新建 ES 相關(guān)資源的任務(wù) ) 到消息隊(duì)列中, Worker 則從消息隊(duì)列中獲取任務(wù)執(zhí)行, 執(zhí)行完具體任務(wù)后, 觸發(fā) Opsflow-FSM 繼續(xù)流轉(zhuǎn). Worker 的實(shí)現(xiàn)使用分布式任務(wù)隊(duì)列 Celery 隊(duì)列堆積時(shí)可快速水平擴(kuò)展.

2.1.5 前端

前端頁(yè)面結(jié)構(gòu)

Opsflow 前端為所有工作流提供了默認(rèn)的頁(yè)面展示, 包括 "流程圖" / "工單進(jìn)度" / "工單詳情" ( key / value 的形式呈現(xiàn)工單實(shí)例的信息) / "工單操作" 等組件, 管理員可以在管理后臺(tái)對(duì)這些組件進(jìn)行是否顯示以及順序等進(jìn)行方便地配置.

工作流自定義前端組件案例

不同的工作流很可能需要定制自己的前端, 例如前文的 "新建 ES 申請(qǐng)" 流程就需要在頁(yè)面上展示 "字段信息" / "SLA" 等信息, Opsflow 對(duì)自定義工作流前端提供了豐富的支持, 對(duì)于 "新建 ES 申請(qǐng)" 這個(gè)流程而言, 負(fù)責(zé)開(kāi)發(fā)的同學(xué)僅需提供一個(gè) React 組件, Opsflow 在渲染工單詳情頁(yè)面的時(shí)候會(huì)根據(jù)配置動(dòng)態(tài)加載 ( 通過(guò) react-loadable ) 相應(yīng)的前端組件渲染在上圖所示的位置, Opsflow 提供給自定義組件提供豐富的 properties, 這些 properties 涵蓋當(dāng)前工單的所有信息, 自定義組件可以根據(jù)這些 properties, 在相應(yīng)后端拉取相應(yīng)的數(shù)據(jù)進(jìn)行渲染, 如上圖的各個(gè)例子.

流程圖繪制

Opsflow-FSM 維護(hù)的有限狀態(tài)機(jī)在數(shù)據(jù)結(jié)構(gòu)上是 Directed acyclic graph (DAG), Opsflow 使用了非常優(yōu)秀的基于 A Technique for Drawing Directed Graphs 中介紹的基于 rank 分層布局算法的 DAG 流程圖繪制庫(kù) dagre-d3 繪制非常飄逸的流程, 見(jiàn)下圖中的例子.

2.2 Opsflow 設(shè)計(jì)中對(duì)前文 "一系列問(wèn)題" 的解決

針對(duì)問(wèn)題 1, 2, 3, 4, 9

Opsflow 提供了 GUI 界面對(duì) FSM 進(jìn)行管理, 流程管理員可以在頁(yè)面上配置 FSM 中的節(jié)點(diǎn)和邊的各種屬性, 流程中不合理的地方可以通過(guò)實(shí)時(shí)呈現(xiàn)的流程圖暴露出來(lái), 管理員可立即做出調(diào)整, 前文減少的前端結(jié)構(gòu)解決了 2, 4 兩個(gè)問(wèn)題.

針對(duì)問(wèn)題 5

有贊 DevOps 平臺(tái)中的絕大多數(shù)流程已經(jīng)遷移到 Opsflow, 基于老的工作流系統(tǒng)的流程已經(jīng)下線, 眾多流程中的共性需求都會(huì)在 Opsflow 實(shí)現(xiàn), 避免重復(fù)造輪子.

針對(duì)問(wèn)題 6

Opsflow 提供 "條件表達(dá)式" 功能, 具體來(lái)說(shuō), 工單管理員在配置一個(gè) FSM "流轉(zhuǎn)" 的時(shí)候可以指定一個(gè) "條件表達(dá)式" 例如 Hive 語(yǔ)句審批流程中的

{row_count} >= 1000000 and not {upload}

Opsflow-FSM 在決定工單下一個(gè)狀態(tài)的時(shí)候會(huì)根據(jù)該表達(dá)式動(dòng)態(tài)的計(jì)算下一個(gè)流程節(jié)點(diǎn), 例子中花括號(hào) row_countupload 分別是該工單實(shí)例的的不同屬性, 例如 row_count 代表 "Hive 語(yǔ)句審批流程" 流程工單實(shí)例中 SQL 影響的行數(shù), 上面的表達(dá)式翻譯成 "人話" 就是: "行數(shù)大于 1000000 且用戶進(jìn)行了上傳則到 XXX 節(jié)點(diǎn)", 其中 "XXX 節(jié)點(diǎn)" 可能是某個(gè)有 Hive 管理權(quán)限的人, 否則可能是 TL 等等.

針對(duì)問(wèn)題 7

Opsflow 與有贊內(nèi)部其他例如 OA 等系統(tǒng)緊密結(jié)合, Opsflow 在根據(jù) FSM 配置計(jì)算下一個(gè)節(jié)點(diǎn)參與人的時(shí)候會(huì)自動(dòng)根據(jù) OA 中的請(qǐng)假代理人信息將節(jié)點(diǎn)審批人替換為請(qǐng)假代理人 ( 如果原審批人在度假 ).

針對(duì)問(wèn)題 8

Opsflow 目前支持的節(jié)點(diǎn)參與人包括:

  • 可配置
  • 多人且多人之間的邏輯可以是 "與" 或 "或"
  • Team leader, 應(yīng)用的 PE / DEV 等角色
  • 自定義
  • 腳本(Python)
  • 自動(dòng)獲取請(qǐng)假代理人
  • 有人審批(有贊員工 App)
  • 通知外部系統(tǒng)
  • 企業(yè)微信通知
  • 催辦
  • ……

基本覆蓋了各種審批流程中的參與人類型需求.

Opsflow 支持的節(jié)點(diǎn)參與人:

  • 條件流轉(zhuǎn)
  • 任意數(shù)量的流轉(zhuǎn)
    m7tVpQ.png

針對(duì)問(wèn)題 10

Opsflow 通過(guò)周期性地運(yùn)行統(tǒng)計(jì)任務(wù)產(chǎn)生統(tǒng)計(jì)圖, 管理員可以直觀了解到不同流程的運(yùn)營(yíng)情況.

三晨逝、 現(xiàn)狀


Opsflow 上線一年多以來(lái), 經(jīng)過(guò)不斷的迭代, 在易用性, 功能, 擴(kuò)展性, 穩(wěn)定性上都有顯著的提升, 截止目前有 60+ 流程截圖, 涉及到 DevOps 中的方方面面, 有贊 DevOps 平臺(tái)以外也已有大數(shù)據(jù)平臺(tái)和美業(yè)等部門的流程接入.

四缎岗、 Roadmap

Opsflow 后續(xù)將會(huì)實(shí)現(xiàn)環(huán)境間流程同步 ( 例如用于測(cè)試的 QA 環(huán)境到生產(chǎn)環(huán)境 Prod 等 ), 允許所有開(kāi)發(fā)進(jìn)行流程新建 / 編輯的開(kāi)放管理后臺(tái)等功能, 進(jìn)一步加速新流程的接入, 另外還有復(fù)制工作流, 更加好用的移動(dòng)端快速審批等功能, 更好的服務(wù)于有贊運(yùn)維和開(kāi)發(fā)同學(xué).

有贊基礎(chǔ)保障 DevOps 團(tuán)隊(duì)榮譽(yù)出品 ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哈打,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挖炬,更是在濱河造成了極大的恐慌壁畸,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茅茂,死亡現(xiàn)場(chǎng)離奇詭異捏萍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)空闲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門令杈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碴倾,你說(shuō)我怎么就攤上這事逗噩。” “怎么了跌榔?”我有些...
    開(kāi)封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵异雁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我僧须,道長(zhǎng)纲刀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任担平,我火速辦了婚禮示绊,結(jié)果婚禮上锭部,老公的妹妹穿的比我還像新娘。我一直安慰自己面褐,他們只是感情好拌禾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著展哭,像睡著了一般湃窍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匪傍,一...
    開(kāi)封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天您市,我揣著相機(jī)與錄音,去河邊找鬼析恢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秧饮,可吹牛的內(nèi)容都是我干的映挂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盗尸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柑船!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泼各,我...
    開(kāi)封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鞍时,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后扣蜻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逆巍,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年莽使,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锐极。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芳肌,死狀恐怖灵再,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亿笤,我是刑警寧澤翎迁,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站净薛,受9級(jí)特大地震影響汪榔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肃拜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一揍异、第九天 我趴在偏房一處隱蔽的房頂上張望全陨。 院中可真熱鬧,春花似錦衷掷、人聲如沸辱姨。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雨涛。三九已至,卻和暖如春懦胞,著一層夾襖步出監(jiān)牢的瞬間替久,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工躏尉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚯根,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓胀糜,卻偏偏與公主長(zhǎng)得像颅拦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子教藻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 DevOps方案實(shí)施在互聯(lián)網(wǎng)行業(yè)中已經(jīng)相對(duì)成熟了距帅,而在游戲行業(yè)中還處在起步的初級(jí)階段(據(jù)個(gè)人了解的身邊游戲公...
    云時(shí)代構(gòu)架楊彪閱讀 2,545評(píng)論 0 8
  • 一般在稍微復(fù)雜一些的后臺(tái)系統(tǒng)中,工作流的設(shè)計(jì)是不可避免的一個(gè)重要部分括堤。設(shè)計(jì)好一個(gè)后臺(tái)工作流碌秸,不僅可以使得后期使用系...
    張哈哈同學(xué)閱讀 1,866評(píng)論 2 28
  • Fbric、Ansible鸦致、Docker潮剪、Chaos Monkey:DevOps工具的年中回顧 【編者按】近日,C...
    OneAPM閱讀 3,090評(píng)論 0 26
  • 渾渾噩噩地過(guò)曰子分唾,分不清四季的輪回抗碰,分不清日月替崗,只是一味地被時(shí)間趕在車輪上绽乔,走與不走弧蝇,由不得自己。 記不清,天...
    是秋天啊閱讀 115評(píng)論 0 6
  • This is Yale 此刻我坐在耶魯大學(xué)的一家法國(guó)風(fēng)情的咖啡館里看疗,一邊享受著法式的咖啡沙峻,一邊等待著美國(guó)朋友。 ...
    SShineling閱讀 229評(píng)論 1 2