開源任務編排框架 TaskFlow
一、簡介
taskflow 是一款輕量、簡單易用、可靈活擴展的通用任務編排框架,基於有向無環圖 (DAG) 的方式實現,框架提供了組件複用、同步 / 異步編排、條件判斷、分支選擇等能力,可以根據不同的業務場景對任意的業務流程進行編排
github 地址: https://github.com/ytyht226/taskflow
使用 DAG 模型的優勢
-
任務模塊化:對於 DAG 任務模型,任務之間沒有很強的相關性,每個任務模塊職責單一,根據輸入進行相應的處理,然後輸出相應的結果,可複用性極強
-
易於調整:基於已有的 DAG 模型,如果想要調整編排流程,往往只需要修改個別任務即可,可以通過修改圖結構或者個別任務的具體實現,即可完成調整
-
結構清晰:將業務的處理流程與具體實現進行解耦,根據流程的定義就可以快速的瞭解整個系統的概況以及包含哪些模塊
模塊結構
-
taskflow-core: taskflow 引擎核心能力
-
taskflow-config: 配置 OP 參數來源
-
taskflow-common: 引擎使用的工具包
-
taskflow-example: taskflow 接入實例,提供測試用例
核心接口及名詞解釋
-
Operator:以下簡稱 OP 或組件,OP 是 DAG 圖中具體的節點,如上圖 1、2、3 等節點;實現 IOperator 接口並開發相應的業務邏輯就可以完成一個 OP 的定義
-
OperatorWrapper:以下簡稱 wrapper,OP 對應的包裝類,在 wrapper 中可以定義節點的名稱、節點與節點之間的關係、節點參數的來源等;引入 wrapper 後可以將 OP 進行解耦,根據不同的業務場景需要對 OP 進行組合使用時,通過 wrapper 描述 OP 之間的依賴關係,串聯成一個編排流程
-
DagEngine:DAG 執行引擎,根據指定的初始節點(如上圖的 1、2、3),執行相應的編排流程;DAG 執行引擎在初始化時可以指定使用不同的線程池,對業務進行隔離;可以設置整個執行過程的超時時間,達到超時時間閾值時,會結束編排流程的執行,沒有執行到的節點不再執行同時執行中的節點也會被中斷
-
強依賴:節點之間默認的依賴關係,只有前面的節點執行結束後纔可以執行後續的節點。如上圖中 1、2 節點執行完纔可以執行 4;3 執行完纔可以執行 5
-
弱依賴:在示例圖中以虛線表示,不同於強依賴的執行邏輯,只要節點依賴的其它節點中有一個執行結束就可以執行當前節點,如上圖中,如果 3 執行完時,4 節點還沒有執行完,此時依然可以執行 5 節點
二、目標與收益
- 通用能力封裝
-
將項目中常用的功能模塊封裝成 OP 組件,這些組件都是通用的,可以在不同的項目中直接使用
-
框架層面統一的日誌上報、降級限流、ABtest 策略等
- 降低開發維護難度
-
開發人員只需要實現具體的 OP,根據業務邏輯,定義好 OP 之間的依賴關係(執行流程),不需要編寫相對複雜的多線程代碼
-
基於編排框架的項目代碼風格統一、業務處理流程比較清晰,根據編排流程的定義就可以快速瞭解整個服務的概況以及包含哪些模塊
-
代碼的可擴展性好,比如要實現具體某個業務需求時,開發相應的 OP 然後以插件的形式集成到項目中就可以,不會對其它模塊產生影響
- 平臺化能力建設
-
可視化,在頁面上可以直觀的展示業務的具體處理流程,也可以拖拽的方式對現有流程進行擴展
-
配置化,基於封裝的通用 OP,可以快速以低代碼的方式實現新業務流程的接入
三、常見的編排場景
1. 串行請求
1、2、3 依次串行執行
2. 並行請求
1、2、3 並行執行
3. 串並行相互依賴
1 執行完後,2、3 再並行執行
4. 弱依賴
1、2、3 中任意一個執行完後,就可以執行 4
5. 准入條件判斷
4 弱依賴 1、2、3 節點,每個節點在執行完後都可以執行 4 的准入條件,判斷當前是否已經滿足執行節點 4 的條件,若滿足則直接執行
6. 分支選擇
根據節點的執行結果選擇要執行的子節點,如上圖所示,最終的執行路徑可能是:
1->3->6->9
7. 複雜場景
流程複雜,沒有嚴格的串行、並行過程
四、引擎執行邏輯
1. 引擎執行的主要流程
2. 引擎執行流程示例
DAG 圖中的節點通過入度 (indegree) 來表示依賴的節點個數,只有當節點的入度爲 0 時,當前節點纔可以執行
DAG 圖中的弱依賴不計入節點的入度,如下圖中的節點 4 初始入度等於 0
實際的執行流程可能存在三種情況
1 -> (2、3)-> 4 -> 5
1 -> 2 -> 4 -> 5
1 -> 3 -> 4 -> 5
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/wI2C5WAWdvfYhgOG6GL4-g