簡介
本文我們将圍繞工作流話題,介紹:
- 什麼是工作流,适用哪些場景?
- 阿裡雲的全托管工作流服務:Serverless 工作流
- Serverless 工作流适用場景
- Serverless 工作流編排函數計算的最佳實踐
維基百科對工作流的定義是:對工作流程及其各操作步驟之間業務規則的抽象、概括描述。我們認為工作流的主要職責是:
- 保證結果一緻性,提高容錯性要求:對錯誤重試,捕獲,執行復原或補償邏輯
- 為長時間運作的流程維護持久化狀态,保證任務排程可靠性
- 控制邏輯和任務邏輯解耦:細化責任,便于管理、維護和擴充
- 流程控制中心化、可視化:增強進度可觀測性,簡化來自不同背景人群的交流
- 模闆方式定義控制邏輯和任務依賴:減少重複工作,統一流程描述标準
工作流通常适用于有狀态的(stateful),異步 (async),長時間執行(long running)等特性的業務場景。其中比較典型的場景包括:
- 視訊,音頻,圖檔處理工作流
- 訂單、審批流程
- 資料處理流水線
- 自動化運維
- 機器學習流水線、基因測序工作流
常見的開源工作流服務軟體如
Apache Airflow,
Activiti Flowable Netflix Conductor等提供了使用代碼,DSL 或是 BPMN 這類标準的工作流描述方式,允許開發者自己搭建工作流服務。不同雲服務廠商也提供了各自的工作流服務如
AWS Step Functions,
AWS Simple Workflow Service Azure Durable Functions。那麼阿裡雲有沒有一個全托管的工作流服務呢?下面的文章将為您介紹阿裡雲 Serverless 工作流,其适用場景和最佳實踐。
Serverless 工作流 (原函數工作流 FnF)
如下面的膠片所示,Serverless 工作流是一個專注于提供分布式任務編排的全托管 Serverless 阿裡雲服務。它不僅有完善的工作流功能,也提供了和阿裡雲多個雲服務豐富的原生內建。開發者可以将任務編寫成
函數計算的函數,構成完全 Serverless 的流程和任務,也可以将無法遷移到函數或者雲上的任務繼續在自己的 VPC 或是自建機房中運作,将編排和排程控制邏輯在雲上執行。Serverless 的特性決定了工作流并行執行數可以彈性水準擴充,無需為工作流服務花費人力資源,僅按使用量付費,不為閑置資源付費。

場景 1 - 視訊處理
視訊處理場景通常涉及多個處理步驟如分片,合并,不同格式轉碼,不同的處理邏輯需要靈活低排列組合實作完成的視訊處理業務,例如有些任務需要借助于函數計算或者 ECS 自建低成本轉碼,有些任務需要借助于阿裡雲媒體處理(MPS),點播 (VOD)實作敏感内容稽核,CDN 重新整理等。取決于原視訊的時長,視訊處理流程的時間通常也都以分鐘,小時,甚至若幹個小時為機關計算。這樣長時間運作的業務需要可靠的狀态維護,錯誤捕獲和重試。視訊處理通常在一天中有周期性的波峰波谷,或是突發的海量視訊上傳。Serverless 彈性伸縮和 Pay-as-you-go 的特性可以從視訊處理吞吐量以及成本等角度更好地滿足視訊處理場景的需求。詳細部落格參考
輕松建構基于 Serverless 架構的彈性高可用音視訊處理系統場景 2 - 資料處理流水線
離線大資料 ETL 流水線,海量 OSS 檔案批量處理,超大 OSS 壓縮包解壓等場景通常有執行時間長,對彈性,成本要求高,對結果正确性有較嚴格要求,且有雲服務事件觸發或者定時觸發的需求。Serverless 工作流最長可以支援執行時長 1 年的流程執行,Serverless 免運維,自動擴容縮容,自帶錯誤重試(retry)和捕獲(catch)機制。持久化的狀态和消息保證資料處理流水線的最終一緻性。通過 FC 的定時觸發器也可以觸發工作流的周期執行。詳見部落格
使用函數工作流+函數計算輕松建構 ETL 離線資料處理系統。
場景 3 - 訂單、審批流程
電商訂單,出遊行程訂單等涉及支付,庫存預留等關鍵業務對于資料一緻性有極強的要求。在分布式微服務的架構下,任何接口調用都有失敗的風險。訂單的工作流程設計需要充分考慮各個步驟可能的失敗,後果和響應的補償邏輯。例如在一個涉及多個分布式支付的流程中,如果第三步支付失敗,工作流程需要自動将已經扣款的前兩部取消并完成退款。Serverless 工作流的 try/catch,持久化狀态維護等特點幫助開發者簡化 SAGA 模式的開發,實作
分布式多步驟事務。審批流程有人工介入,審批網絡不統一等場景特點,Serverless 工作流提供的任務分發至隊列+回調功能可以幫助審批流程開發者輕松滿足此類需求。
場景 4 - 自動化運維
生産環境的自動化運維工作流如 ECS 鏡像,快照的建構,叢集上下線機器需要可靠且靈活的邏輯描述能力。相比于描述依賴關系的 DAG (有向無環圖)模型,Serverless 工作流提供了 FDL 這樣更加強大和靈活的描述能力。定時觸發,長時間執行,低成本和 100% 資源使用率也都是可以滿足自動化運維場景中的常見需求。
場景 5 - 機器學習流水線
機器學習流水線設計算法開發,資料清洗,轉化處理,模型訓練,模型部署等多個步驟。生産環境中需要一個輕量的工作流引擎實作一個完整的 ML 回報回路。Serverless Workflow 提供的人工介入能力,長時間執行和狀态靠的特點可以很好地滿足 ML 流水線。詳見部落格
生産中的 Serverless 機器學習流水線FC 函數編排最佳實踐
這個段落我們将介紹函數計算(FC)異步任務編排的最佳實踐。下圖列出了 Serverless Workflow 結合 FC 的優勢。
強化單個異步函數
需要澄清的是,工作流并非隻适用于多個函數的編排,實際上任何一個需要狀态觀測(可查詢),執行時間長,結果重要不允許消息丢失的場景,如下圖的事件觸發場景所示,即使整個邏輯隻有一個 FC 函數,也推薦使用工作流強化,保證函數有足夠的重試機會。另一個使用工作流來強化單函數的應用場景是使函數計算 HTTP 觸發器能夠支援異步調用,目前 FC HTTP 觸發器僅限于同步調用。使用 HTTP FC 發起工作流(StartExecution)後即傳回。使用另一個 HTTP FC 函數 (DescribeExecution) 達到了 HTTP 異步觸發任務且可以使用 HTTP 查詢的效果。
編排多個函數
下面的一系列圖列舉了編排多個函數常見的 4 種方式:
- 方式 1:單體函數(Monolith functions): 整個流程在同一個程序中運作
Serverless 工作流适用場景及最佳實踐 - 方式 2:函數編排(Function orchestration): 整個流程由一個編排函數同步調用多個任務函數完成
Serverless 工作流适用場景及最佳實踐 - 方式 3:事件觸發點對點調用(Choreography):沒有中心化的控制器,每個任務負責異步觸發下一個任務
Serverless 工作流适用場景及最佳實踐 - 方式 4:Serverless 工作流編排(Workflow orchestration): 由中心化的工作流服務排程不同函數
Serverless 工作流适用場景及最佳實踐
下圖是對于 4 種調用方式的對比分析。可以看到單體編排更适用于要求極低延遲,無狀态 (stateless)的線上業務,邏輯相對簡單,執行時間短的場景。FC 函數編排從維護上與微服務模型更加相似,更易于維護和多個團隊協作,由于單函數的執行時間限制,同樣不适用于長時間執行,也不适用于需要狀态持久化 (stateful) 的流程。事件觸發通過異步調用可以突破函數執行時長的限制,并且獲得一定程度的狀态持久化。然後持久化以及重試的程度并不能自定義,可觀測性較低和開發成本偏高。對于長時間執行,需要狀态維護,自定義重試等場景的關鍵流程,我們推薦用 Serverless 工作流的方式編排,獲得最高的容錯性,無限的執行時長,最優化的成本。
總結
本文我們簡單介紹了工作流以及阿裡雲的工作流服務 Serverless Workflow。工作流适用于視訊處理,資料處理流水線,訂單、審批流程,自動化運維機器學習流水線等依賴工作流引擎的場景。使用工作流可以很好地補充完善單個 FC 異步函數的可靠性和可觀測性。對于多個 FC 函數的編排,我們給出了 4 種不同的方法編排方式的最佳實踐以及其對比分析,您可以根據實際場景選擇編排方式。如果您的異步流程對正确性和持久化要求較高,執行時間較長 (分鐘級别),關注異步任務的狀态,我們推薦使用工作流編排 FC。如名字所示,全托管免運維,自動伸縮,100% 資源使用率,成本優化是 Serverless 解決方案的核心價值。
聯系我們
如果您對工作流,函數計算,或者 Serverless 相關話題感興趣歡迎加入我們的官網釘釘群交流、分享、讨論。