天天看點

如何建構一套高性能、高可用性、低成本的視訊處理系統?

前言

近些年,線上教育行業飛速發展,為整個社會的知識傳播提供了前所未有的便利性。通過多種形式的線上教育平台,學員與教師即使相隔萬裡也可以開展教學活動。借助豐富的網絡課件,學員還可以随時随地的進行學習,真正打破了時間和空間的限制。在各種形式的網絡課件中,視訊課件自然是最直覺表現力最豐富的形式,是以視訊課件的市場占有率也在逐年提升。

視訊處理需求分析

對于線上教育領域的視訊課件出品方而言,每天都要對大量視訊内容進行處理,下圖展示了一個比較典型的場景:

如何建構一套高性能、高可用性、低成本的視訊處理系統?

1、使用者上傳一個視訊到平台後,會先在對象存儲中對視訊源檔案進行暫存。

2、平台對視訊進行預處理,并打上水印。

3、平台将視訊檔案轉換為其他格式,并對分辨率進行調整,以适配各種不同的終端裝置的要求。

4、将處理好的視訊檔案儲存回對象存儲,并同步到 CDN 進行加速。

雖然從流程上來講,這個場景比較簡單,但在技術上的挑戰其實是非常大的。視訊課件的原作者來自于線上教育平台的廣大使用者,可能是平台負責内容輸出的内部使用者,也有可能是簽約的教師,或者是平台認證過的分享型使用者。使用者上傳視訊的操作并沒有固定的頻率,往往集中在幾個時間段,存在明顯的波峰波谷。在業務高峰期,視訊處理的需求量非常大,有的線上教育企業每天要完成數萬個視訊的轉碼工作。對于負責建設視訊處理系統的技術團隊而言,這樣的業務場景就留給了他們一系列的挑戰:

1、如何確定這套系統在業務高峰期的高可用性?

2、如何讓每一個上傳的視訊盡可能快的處理完?

3、如何盡可能的降低資源成本?

4、如何高效率的應對需求的頻繁變更?

基于這幾個訴求,我們結合雲計算的特點,來分析一下可行的解決方案。

使用 SaaS 化的雲服務完成視訊處理

随着各大雲計算廠商産品線的不斷豐富,我們可以很輕松的尋找到開箱即用的方案來解決這類典型的視訊處理需求。以阿裡雲為例,視訊點播類産品提供了視訊采集、編輯、上傳、媒體資源管理、轉碼處理、視訊稽核分析、分發加速于一體的一站式解決方案。

如何建構一套高性能、高可用性、低成本的視訊處理系統?

對于技術團隊而言,采用這樣的方案不用預先準備任何計算資源,甚至不用編寫任何代碼,就能夠從無到有擁有一整套視訊處理系統,完全不用考慮資源規劃的問題。這樣的方案非常适合在業務發展初級需要讓系統快速上線的場景。

但随着業務的不斷發展,開箱即用的 SaaS 化方案還是存在不少的局限性,基于如下的原因,大多數的技術團隊還是會選擇自己建設視訊處理系統:

1、對于之前已經通過 FFmpeg 技術實作的視訊處理服務,因為涉及到複雜的業務邏輯,很難直接遷移到 SaaS 化方案上來。

2、高階的視訊處理需求必須使用代碼來實作:比如音頻降噪、插入動态 Gif 水印、按固定頻率截幀等等。

3、使用高分辨率的大視訊是行業趨勢,對于超大視訊的處理,比如 10G 以上的 1080P 視訊,往往需要通過自定義的手段進行計算優化,才能保證處理的及時性。

4、在很多種場景下,自建視訊處理系統都會帶來明顯的成本優勢。

5、頻繁的業務需求變更需要對整套系統進行更精細粒度的疊代管理,比如采用金絲雀政策降低新版本釋出所帶來的風險。

那麼如何建設一套同時具備高性能、高可用性、高靈活性、低成本特點的視訊處理系統呢?

基于分布式叢集

最典型的方案是申請一組雲虛拟機,在每台虛拟機上部署視訊處理應用,組建成一個可以水準伸縮的服務集服。當有新的上頻上傳的時候,可以觸發一個處理任務,并通過負載均衡或消息隊列對任務進行分發,接到任務的應用節點負責完成對應的任務。

如何建構一套高性能、高可用性、低成本的視訊處理系統?

通過這個架構,在業務高峰期,使用者上傳視訊行為比較密集,可以增加服務叢集的執行個體數量,來提升處理能力。在業務低峰期,可以減少服務叢集的執行個體數量,來減少資源成本。

此方案可以通過定制化的代碼邏輯實作各種高階的視訊處理需求,靈活度非常高,配合可以水準伸縮的計算叢集以及負載均衡機制,能同時滿足性能和成本方面的需求,是一套被廣泛采納的方案。但在生産環境大規模運作的情況下,這套方案還是會暴露出很多問題:

維護工作量大。整套系統的維護工作量涵蓋了虛拟機、網絡、負載均衡元件、作業系統、應用等多個層面,需要投入大量的時間和精力來保障系統的高可用性與穩定性。舉一個最簡單的例子,當某個應用執行個體出現故障的時候,如何第一時間定位故障并盡可能迅速的将其從計算叢集中摘除,摘除之後又如何保證之前沒有完成的任務能夠重新得到處理呢?這些都需要再配合完整的監控機制、故障隔離恢複機制來實作,甚至涉及到代碼層的業務邏輯優化。

彈性伸縮能力滞後。有兩種方式實作計算叢集的彈性伸縮:通過定時任務觸發,或者通過名額門檻值(CPU使用率,記憶體使用率等)觸發。不管采用哪種方式,都沒有辦法基于使用者行為精細化管理,在遇到任務密度大幅度起伏的時候,會面臨彈性伸縮能力滞後的問題。當來自使用者的視訊上傳請求突增的時候,新增一個應用執行個體需要經過申請雲資源>初始化>部署應用鏡像>應用啟動>加入負載均衡清單等多個階段,即便通過 Kubernetes + 預留資源池等技術優化,也往往需要 10 分鐘以上。

資源使用率低。滞後的彈性伸縮能力會導緻伸縮政策制定的相對保守,造成計算資源的大量浪費,增加了使用成本,如下圖所示:

如何建構一套高性能、高可用性、低成本的視訊處理系統?

有沒有一種方案能能幫助技術團隊專注于業務邏輯的實作,并可以根據使用者的實際上傳請求進行精細化的資源配置設定,實作資源利用最大化呢?随着雲計算的飛速發展,各大雲廠商都在積極探索新的方案,用更加“雲原生”的方式來解決成本和效率的問題,阿裡雲提供的函數計算 + Serverless 工作流就是這個領域非常具有代表性的方案。

函數計算

阿裡雲函數計算是事件驅動的全托管計算服務。通過函數計算,開發者無需管理伺服器等基礎設施,隻需編寫代碼并上傳。函數計算會為自動準備好計算資源,以彈性、可靠的方式運作代碼,并提供日志查詢、性能監控、報警等功能,確定系統的穩定運作。

相比傳統的應用伺服器保持運作狀态并對外提供服務的方式,函數計算最大的差別是按需拉起計算資源對任務進行處理,在任務完成以後自動的回收計算資源,這是一種真正符合 Serverless 理念的方案,能最大化的提升資源使用率,減少系統系統維護工作量和使用成本。因為不需要預先申請計算資源,使用者完全不需要考慮容量評估和彈性伸縮的問題,隻需要根據資源的實際使用量來進行付費。

下圖展示了函數計算的工作方式:

如何建構一套高性能、高可用性、低成本的視訊處理系統?

對于使用者而言,把實作關鍵業務邏輯的代碼上傳到函數計算平台,就能以事件驅動的方式觸發函數執行。函數計算已經支援各種主流的程式設計語言,對于即有的代碼,可以通過幾個非常簡單的步驟部署到函數計算。函數支援的所有開發語言請參考開發語言清單:

https://help.aliyun.com/document_detail/74712.html

每一次計算資源的配置設定,都基于事件的觸發,一個事件往往對應着業務上的一個任務。函數計算支援多種多樣的觸發器,比如HTTP觸發器的事件源就是 HTTP 請求,函數計算接收到一次 HTTP 請求後,會按照預設的規格,配置設定相應的計算資源來處理這個 HTTP 請求,請求處理完成之後,函數計算會根據使用者的設定決定是否立即回收這一次拉起的計算資源。而 OSS 觸發器,能夠監控發生在對象存儲 OSS 上的各種事件,當有使用者上傳新檔案或者對檔案進行修改的時候,自動觸發函數執行,這種方式就剛好适合視訊處理的業務場景。更多支援的函數觸發器請參考觸發器清單:

https://help.aliyun.com/document_detail/74707.html

在計算資源的排程上,函數計算進行了大量優化,面對使用者請求的突增,可以在毫秒級拉起大量的計算資源來并行工作,確定使用者體驗。

通過函數計算進行視訊處理

基于函數計算的特性,搭建一套視訊處理系統就非常簡單,隻需要配置一個 OSS 觸發器,并将視訊處理的核心代碼上傳到函數計算,就大功告成:

如何建構一套高性能、高可用性、低成本的視訊處理系統?

通過這套方案,使用者不再需要考慮資源管理、負載均衡、系統高可用、彈性伸縮、系統監控等一系列複雜的問題,函數計算平台會按最優的方式根據使用者的上傳行為排程計算資源,低成本高效率的完成視訊處理任務。具體的操作步驟和代碼實作可以參考視訊處理 Python 實作 Demo :

https://github.com/awesome-fc/simple-video-processing

在這個 Demo 中,示範了如何基于函數計算将使用者上傳的視訊統一轉為 640 * 480 分辨率的 mp4 格式視訊。

代碼開發

每一個建立好的函數都會對應一個指定的入口,函數計算會從這個函數入口開始執行,類似于本地開發中的 Main() 函數。以 Python 語言為列,一個簡單的入口函數如下:

def handler(event, context):

return 'hello world'

當有事件觸發的時候,就會從入口函數開始執行,其中 event 參數攜帶了事件源相關的資訊,比如在視訊處理場景中,event 參數攜帶了上傳到 OSS 的 Bucket 以及檔案名等資訊。而 context 參數攜帶了函數的運作資訊,包括函數名、逾時時間、通路憑證等。通過這些資訊,就能讓執行代碼完成預定義的各種操作。

函數計算支援各種主流的程式設計語言,在這個程式設計語言當中, Node.js 和 Python 等腳本型語言含了豐富的類庫,開發效率很高,而且運算執行個體啟動的速度很快,能夠支援對延遲特别敏感的任務,是函數計算最比對的語言。Java 和 Go 等語言不能像腳本型語言一樣直接上傳代碼就能建立一個函數,需要預先進行編譯,使用起來會稍微複雜一些,但配合函數計算提供的 Funcraft 等工具,也可以大幅度提升開發和部署的效率。不管使用哪種開發語言,都建議使用者下載下傳官方提供的 Funcraft 工具,更輕松進行開發、建構、部署操作,請參考 Funcraft :

https://help.aliyun.com/document_detail/140283.html

像 Java 這樣的語言,在虛拟機啟動的時候需要加載比較多的類庫,不能夠像實作運算執行個體毫秒級啟動并進入執行狀态,不能直接使用在一些對于延遲特别敏感的業務場景。但配合函數計算提供的預留執行個體以及單執行個體多并發新功能,能夠消除冷啟動對業務的影響,并降低等待下遊服務響應的影響,讓函數計算上運作的 Java 語言也能實作 API 網關等對延時要求特别高業務場景。請參考預留執行個體:

https://help.aliyun.com/document_detail/138103.html

和單執行個體多并發:

https://help.aliyun.com/document_detail/144586.html

Serverless 工作流

通過前面介紹的方案,可以輕松完成對短視訊的各種定制化處理。但每一個函數計算執行個體,在資源規格上和總運作時長都不是無限的,目前函數計算執行個體可以擁有 3G 的記憶體資源和 10 分鐘的執行時間,這也就說明,當一個視訊處理任務需要占用 3G 以上的系統記憶體,或者總執行時長超過 10 分鐘的情況下,處理任務是會失敗的。

在 5G 時代,超大視訊課件是非常普遍的需求,如何通過函數計算處理這樣的大視訊呢?這個時候就要出動另一個武器--- Serverless 工作流,來配合函數計算一起完成這個任務。

Serverless 工作流是一個用來協調多個分布式任務執行的全托管雲服務。您可以用順序、選擇、并行等方式來編排分布式任務,Serverless 工作流會按照設定好的步驟可靠地協調任務執行,跟蹤每個步驟的狀态轉換,并在必要時執行使用者定義的重試邏輯,以確定工作流順利完成。Serverless 工作流通過提供日志記錄和審計來監視工作流的執行,友善您輕松地診斷和調試應用。

如何建構一套高性能、高可用性、低成本的視訊處理系統?
如何建構一套高性能、高可用性、低成本的視訊處理系統?

您可以使用 Serverless 工作流編排一系列的函數資源,同時定義流程中每一步的輸入和輸出,使用内置控制步驟編排複雜邏輯、發起并行執行、管理逾時或終止流程。另外通過控制台能夠使用圖形界面顯示出執行任務狀态和執行順序,同時控制台會顯示每個步驟的實時狀态,并提供每次執行的詳細曆史記錄。通過 Serverless 工作流 + 函數計算的組合,我們可以突破時間和空間的限制,對任意大小的視訊檔案進行複雜的處理。

大視訊處理

簡單來講,處理一個大視訊的基本思路是:

1、将視訊先進行切片處理,把每一個分片的大小控制在合理的大小,以便單個函數計算執行個體可以對其進行快速處理。

2、拉起多個函數計算執行個體對每一個分片進行并行處理。

3、對處理結果進行合并。

通過 Serverless 工作流 + 函數計算進行視訊處理的流程如下:

如何建構一套高性能、高可用性、低成本的視訊處理系統?

通過 Serverless 工作流提供的可視界面,我們能在工作流執行的過程當中,友善的檢視到每一個步驟運作的資訊,并配合自定義的 Dashboard 實作對整套視訊處理系統的全面監控:

如何建構一套高性能、高可用性、低成本的視訊處理系統?

方案對比

如何建構一套高性能、高可用性、低成本的視訊處理系統?

總結

基于函數計算和 Serverless 工作流的彈性高可用視訊處理架構,充分展現了雲原生時代 Serverless 化思想,以事件驅動的形式觸發函數執行,真實計算資源真正意義上的按需使用。對于使用而言,這套方案在保證業務靈活度的同時,可以顯著降低維護成本與資源成本,并大幅度的縮短項目傳遞時間。

線上教育領域對于視訊處理的需求量非常大,而且對于處理速度、并發吞吐量、資源使用率等方面都有極高的要求,函數計算 + Serverless 工作流方案組合幫助使用者輕松建設彈性高可用的視訊處理架構,是實作這些複雜需求的最優解。随着雲原生的不斷發展, Serverless 相關技術還将深入更多的業務場景,有未來有無限可能!

【更多精彩】

1.中間件爆款一折起,還有阿裡巴巴十年最佳實踐深度解密,點選馬上了解:

https://www.aliyun.com/activity/daily/commercial?spm=5176.20960838.0.0.6a54305etoEn4D

2.【填問卷領淘公仔】點選馬上填寫問卷:

https://survey.aliyun.com/apps/zhiliao/YmW95Gk8bU

【加入行業實戰交流釘釘群】

阿裡雲專門成立了“網際網路架構更新實戰課”釘釘群,每周邀請一位阿裡雲專家在群内進行行業最佳實踐直播,每天分享行業前沿幹貨,釘釘掃碼馬上加入。

如何建構一套高性能、高可用性、低成本的視訊處理系統?