工作流框架的實現

加班加點,思考了一週的工作流模型,在實現的過程中一點一點完善,終於落地。

作業定義

首先將一個工作流的實例定義爲Job,包括:

1.JobId,作業標識,從1開始遞增。

2.JobTitle,作業標題。

3.JobStatus,作業狀態:進行、休眠、中止、完成。當一個作業創建時,其狀態爲未開始,獲得調度執行時,作業狀態切換爲“進行”狀態,當作業執行過程中因爲某些條件不成熟被迫中止而進入到休眠狀態,作業執行過程中遇到異常時也進入中止狀態,作業徹底執行完畢後則進入到“完成”狀態,不會再獲得調度。

4.JobProgress,作業進度,主要是指當前作業執行到工作流中流程節點具體的哪個節點。

5.JobPrority,作業優先級,每當作業調度新的作業時,按照優先級高低獲取最高優先級的作業進行調度。

6.JobCreatedTime,作業創建時間。

7.JobPausedTime,作業中止時間,作業失去調度的時間,即作業進入異常、休眠、完成狀態時的時間。

8.JobFinishedTime,作業完成的時間。

9.JobCreator,作業的創建者。

10.JobWorkflow,作業的工作流節點集合。主要存儲了工作流節點的調用方式和調用地址,如:RPC、RESTFUL、LOCAL等方式的調用及時地址。

11.JobContext,作業上下文。一個作業從創建到完成的全部全局數據,作業在調用不同工作流節點時需要實現多個節點的數據共享,即A節點的輸出爲B節點的輸入,A節點的輸出和B節點的輸出爲C節點的輸入。

12.JobLog,作業日誌,記錄作業的執行過程。

作業存儲

作業的存儲採用“緩存+數據庫”的模式實現。創建一個作業時,將作業的數據根據優先級寫入到緩存隊列,並標識當前作業數據狀態爲1,後臺輪循並將其寫入數據庫,並將數據狀態標識爲0。

作業調度

作業調度採用一個大的死循環實現,在循環中從隊列中獲取一個最高優先級的休眠態任務,按照作業進度從工作流節點集合中獲取對應工作節點,根據調用方式傳入作業上下文JobContext進行調用,然後根據返回結果進行下一個工作節點調用。如果返回結果異常/需等待,則將作業切換至中止/休眠態,保存作業數據到緩存隊列,退出當前作業,調度下一個作業。

人工干預

一個作業涉及到外部多個微服務,作業中止的原因可能有:數據異常、配置錯誤、會話丟失、服務超時。作業中止後需要人工干預,有的作業因爲數據錯誤無法繼續進行,而有的作業經過人工干預後還可以繼續執行,這時候人工可將作業狀態切換至休眠態,等待下一次調度。

作業日誌

作業執行過程中,會調用大量微服務,中間也會出現很多日誌信息,這些對於我們後面維護作業非常重要,如因爲某個微服務會話失效,作業被迫中止,我們通過日誌信息可以及時修改會話,將任務切換至休眠態等待下一次調度。作業日誌主要包括:

1.JobLogID,作業日誌id,從1開始自增。

2.JobID,作業Id,標識是哪個作業的日誌。

3.JobLogCreatedTime,作業日誌創建時間。

4.JobLogCreator,作業創建者,包括系統自己,如作業的創建、作業調度了哪個工作節點、作業因爲什麼原因中止/休眠等等。

5.JobLogInfo,作業日誌信息。

作業日誌信息顯示

用戶一般從作業進入到作業詳情,在作業詳情中採用時間軸的方式展示作業執行的過程以及作業日誌信息。

工作節點的調度

作業節點以微服務的方式提供給調度系統

工作節點管理

工作節點由用戶/開發者自行配置,包括調用方式RPC、RESTFUL,調用方法、地址。

工作流管理

工作流主要將工作節點有序的連接起來,從工作節點集合選取相應的節點加入,並對加入的節點進行拖拽排序,從一個節點進入到另一個節點的條件判斷可以放置到下一個節點的調用中實現,這樣就做到了低耦合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章