一、 背景
隨著有贊規(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)題:
- 流程的可定制化程度低
- 卷入流程的人無(wú)法感知一個(gè)流程的進(jìn)度
- 無(wú)法可視化流程, 需要人肉檢查配置, 容易出錯(cuò)
- 前端可定制程度低
- 各種審批流程分散在不同的應(yīng)用中, 重復(fù)造輪子
- 不支持動(dòng)態(tài)確定流程分支
- 老系統(tǒng)無(wú)法處理審批人請(qǐng)假等問(wèn)題
- 參與人類型支持缺乏
- 新流程接入成本高
- 無(wú)集中的統(tǒng)計(jì)報(bào)表, 較難感知運(yùn)營(yíng)情況
- ...
Opsflow 的系統(tǒng)設(shè)計(jì)以及在有贊的落地情況, 內(nèi)容包括:
- Opsflow 系統(tǒng)設(shè)計(jì)
- 目前在有贊 DevOps 平臺(tái)的落地現(xiàn)狀
- 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_count
和 upload
分別是該工單實(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)參與人:
針對(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ù)出品 ??