近些年,在線教育行業(yè)飛速發(fā)展,為整個社會的知識傳播提供了前所未有的便利性。通過多種形式的在線教育平臺,學(xué)員與教師即使相隔萬里也可以開展教學(xué)活動。借助豐富的網(wǎng)絡(luò)課件,學(xué)員還可以隨時隨地的進行學(xué)習(xí),真正打破了時間和空間的限制。在各種形式的網(wǎng)絡(luò)課件中,視頻課件自然是最直觀表現(xiàn)力最豐富的形式,因此視頻課件的市場占有率也在逐年提升。
視頻處理需求分析
對于在線教育領(lǐng)域的視頻課件出品方而言,每天都要對大量視頻內(nèi)容進行處理,下圖展示了一個比較典型的場景:
(1)用戶上傳一個視頻到平臺后,會先在對象存儲中對視頻源文件進行暫存。
(2)平臺對視頻進行預(yù)處理,并打上水印。
(3)平臺將視頻文件轉(zhuǎn)換為其他格式,并對分辨率進行調(diào)整,以適配各種不同的終端設(shè)備的要求。
(4)將處理好的視頻文件保存回對象存儲,并同步到CDN進行加速。
雖然從流程上來講,這個場景比較簡單,但在技術(shù)上的挑戰(zhàn)其實是非常大的。視頻課件的原作者來自于在線教育平臺的廣大用戶,可能是平臺負責(zé)內(nèi)容輸出的內(nèi)部用戶,也有可能是簽約的教師,或者是平臺認(rèn)證過的分享型用戶。用戶上傳視頻的操作并沒有固定的頻率,往往集中在幾個時間段,存在明顯的波峰波谷。在業(yè)務(wù)高峰期,視頻處理的需求量非常大,有的在線教育企業(yè)每天要完成數(shù)萬個視頻的轉(zhuǎn)碼工作。對于負責(zé)建設(shè)視頻處理系統(tǒng)的技術(shù)團隊而言,這樣的業(yè)務(wù)場景就留給了他們一系列的挑戰(zhàn):
(1)如何確保這套系統(tǒng)在業(yè)務(wù)高峰期的高可用性?
(2)如何讓每一個上傳的視頻盡可能快的處理完?
(3)如何盡可能的降低資源成本?
(4)如何高效率的應(yīng)對需求的頻繁變更?
基于這幾個訴求,我們結(jié)合云計算的特點,來分析一下可行的解決方案。
使用SaaS化的云服務(wù)完成視頻處理
隨著各大云計算廠商產(chǎn)品線的不斷豐富,我們可以很輕松的尋找到開箱即用的方案來解決這類典型的視頻處理需求。以阿里云為例,視頻點播類產(chǎn)品提供了視頻采集、編輯、上傳、媒體資源管理、轉(zhuǎn)碼處理、視頻審核分析、分發(fā)加速于一體的一站式解決方案。
對于技術(shù)團隊而言,采用這樣的方案不用預(yù)先準(zhǔn)備任何計算資源,甚至不用編寫任何代碼,就能夠從無到有擁有一整套視頻處理系統(tǒng),完全不用考慮資源規(guī)劃的問題。這樣的方案非常適合在業(yè)務(wù)發(fā)展初級需要讓系統(tǒng)快速上線的場景。
但隨著業(yè)務(wù)的不斷發(fā)展,開箱即用的SaaS化方案還是存在不少的局限性,基于如下的原因,大多數(shù)的技術(shù)團隊還是會選擇自己建設(shè)視頻處理系統(tǒng):
(1)對于之前已經(jīng)通過FFmpeg技術(shù)實現(xiàn)的視頻處理服務(wù),因為涉及到復(fù)雜的業(yè)務(wù)邏輯,很難直接遷移到SaaS化方案上來。
(2)高階的視頻處理需求必須使用代碼來實現(xiàn):比如音頻降噪、插入動態(tài)Gif水印、按固定頻率截幀等等。
(3)使用高分辨率的大視頻是行業(yè)趨勢,對于超大視頻的處理,比如10G以上的1080P視頻,往往需要通過自定義的手段進行計算優(yōu)化,才能保證處理的及時性。
(4)在很多種場景下,自建視頻處理系統(tǒng)都會帶來明顯的成本優(yōu)勢。
(5)頻繁的業(yè)務(wù)需求變更需要對整套系統(tǒng)進行更精細粒度的迭代管理,比如采用金絲雀策略降低新版本發(fā)布所帶來的風(fēng)險。
那么如何建設(shè)一套同時具備高性能、高可用性、高靈活性、低成本特點的視頻處理系統(tǒng)呢?
基于分布式集群
最典型的方案是申請一組云虛擬機,在每臺虛擬機上部署視頻處理應(yīng)用,組建成一個可以水平伸縮的服務(wù)集服。當(dāng)有新的上頻上傳的時候,可以觸發(fā)一個處理任務(wù),并通過負載均衡或消息隊列對任務(wù)進行分發(fā),接到任務(wù)的應(yīng)用節(jié)點負責(zé)完成對應(yīng)的任務(wù)。
通過這個架構(gòu),在業(yè)務(wù)高峰期,用戶上傳視頻行為比較密集,可以增加服務(wù)集群的實例數(shù)量,來提升處理能力。在業(yè)務(wù)低峰期,可以減少服務(wù)集群的實例數(shù)量,來減少資源成本。
此方案可以通過定制化的代碼邏輯實現(xiàn)各種高階的視頻處理需求,靈活度非常高,配合可以水平伸縮的計算集群以及負載均衡機制,能同時滿足性能和成本方面的需求,是一套被廣泛采納的方案。但在生產(chǎn)環(huán)境大規(guī)模運行的情況下,這套方案還是會暴露出很多問題:
(1)維護工作量大。
整套系統(tǒng)的維護工作量涵蓋了虛擬機、網(wǎng)絡(luò)、負載均衡組件、操作系統(tǒng)、應(yīng)用等多個層面,需要投入大量的時間和精力來保障系統(tǒng)的高可用性與穩(wěn)定性。舉一個最簡單的例子,當(dāng)某個應(yīng)用實例出現(xiàn)故障的時候,如何第一時間定位故障并盡可能迅速的將其從計算集群中摘除,摘除之后又如何保證之前沒有完成的任務(wù)能夠重新得到處理呢?這些都需要再配合完整的監(jiān)控機制、故障隔離恢復(fù)機制來實現(xiàn),甚至涉及到代碼層的業(yè)務(wù)邏輯優(yōu)化。
(2)彈性伸縮能力滯后。
有兩種方式實現(xiàn)計算集群的彈性伸縮:通過定時任務(wù)觸發(fā),或者通過指標(biāo)閾值(CPU利用率,內(nèi)存使用率等)觸發(fā)。不管采用哪種方式,都沒有辦法基于用戶行為精細化管理,在遇到任務(wù)密度大幅度起伏的時候,會面臨彈性伸縮能力滯后的問題。當(dāng)來自用戶的視頻上傳請求突增的時候,新增一個應(yīng)用實例需要經(jīng)過申請云資源>初始化>部署應(yīng)用鏡像>應(yīng)用啟動>加入負載均衡列表等多個階段,即便通過Kubernetes+預(yù)留資源池等技術(shù)優(yōu)化,也往往需要10分鐘以上。
(3)資源利用率低。
滯后的彈性伸縮能力會導(dǎo)致伸縮策略制定的相對保守,造成計算資源的大量浪費,增加了使用成本,如下圖所示:
有沒有一種方案能能幫助技術(shù)團隊專注于業(yè)務(wù)邏輯的實現(xiàn),并可以根據(jù)用戶的實際上傳請求進行精細化的資源分配,實現(xiàn)資源利用最大化呢?隨著云計算的飛速發(fā)展,各大云廠商都在積極探索新的方案,用更加“云原生”的方式來解決成本和效率的問題,阿里云提供的函數(shù)計算 + Serverless工作流就是這個領(lǐng)域非常具有代表性的方案。
函數(shù)計算
阿里云函數(shù)計算是事件驅(qū)動的全托管計算服務(wù)。通過函數(shù)計算,開發(fā)者無需管理服務(wù)器等基礎(chǔ)設(shè)施,只需編寫代碼并上傳。函數(shù)計算會為自動準(zhǔn)備好計算資源,以彈性、可靠的方式運行代碼,并提供日志查詢、性能監(jiān)控、報警等功能,確保系統(tǒng)的穩(wěn)定運行。
相比傳統(tǒng)的應(yīng)用服務(wù)器保持運行狀態(tài)并對外提供服務(wù)的方式,函數(shù)計算最大的區(qū)別是按需拉起計算資源對任務(wù)進行處理,在任務(wù)完成以后自動的回收計算資源,這是一種真正符合Serverless理念的方案,能最大化的提升資源利用率,減少系統(tǒng)系統(tǒng)維護工作量和使用成本。因為不需要預(yù)先申請計算資源,使用者完全不需要考慮容量評估和彈性伸縮的問題,只需要根據(jù)資源的實際使用量來進行付費。
下圖展示了函數(shù)計算的工作方式:
對于使用者而言,把實現(xiàn)關(guān)鍵業(yè)務(wù)邏輯的代碼上傳到函數(shù)計算平臺,就能以事件驅(qū)動的方式觸發(fā)函數(shù)執(zhí)行。函數(shù)計算已經(jīng)支持各種主流的編程語言,對于即有的代碼,可以通過幾個非常簡單的步驟部署到函數(shù)計算。函數(shù)支持的所有開發(fā)語言請參考開發(fā)語言列表。
每一次計算資源的分配,都基于事件的觸發(fā),一個事件往往對應(yīng)著業(yè)務(wù)上的一個任務(wù)。函數(shù)計算支持多種多樣的觸發(fā)器,比如HTTP觸發(fā)器的事件源就是HTTP請求,函數(shù)計算接收到一次HTTP請求后,會按照預(yù)設(shè)的規(guī)格,分配相應(yīng)的計算資源來處理這個HTTP請求,請求處理完成之后,函數(shù)計算會根據(jù)用戶的設(shè)置決定是否立即回收這一次拉起的計算資源。而OSS觸發(fā)器,能夠監(jiān)控發(fā)生在對象存儲OSS上的各種事件,當(dāng)有用戶上傳新文件或者對文件進行修改的時候,自動觸發(fā)函數(shù)執(zhí)行,這種方式就剛好適合視頻處理的業(yè)務(wù)場景。更多支持的函數(shù)觸發(fā)器請參考觸發(fā)器列表。
在計算資源的調(diào)度上,函數(shù)計算進行了大量優(yōu)化,面對用戶請求的突增,可以在毫秒級拉起大量的計算資源來并行工作,確保用戶體驗。
通過函數(shù)計算進行視頻處理
基于函數(shù)計算的特性,搭建一套視頻處理系統(tǒng)就非常簡單,只需要配置一個OSS觸發(fā)器,并將視頻處理的核心代碼上傳到函數(shù)計算,就大功告成:
通過這套方案,使用者不再需要考慮資源管理、負載均衡、系統(tǒng)高可用、彈性伸縮、系統(tǒng)監(jiān)控等一系列復(fù)雜的問題,函數(shù)計算平臺會按最優(yōu)的方式根據(jù)用戶的上傳行為調(diào)度計算資源,低成本高效率的完成視頻處理任務(wù)。具體的操作步驟和代碼實現(xiàn)可以參考視頻處理Python實現(xiàn)Demo,在這個Demo中,演示了如何基于函數(shù)計算將用戶上傳的視頻統(tǒng)一轉(zhuǎn)為640 * 480分辨率的mp4格式視頻。
代碼開發(fā)
每一個創(chuàng)建好的函數(shù)都會對應(yīng)一個指定的入口,函數(shù)計算會從這個函數(shù)入口開始執(zhí)行,類似于本地開發(fā)中的Main()函數(shù)。以Python語言為列,一個簡單的入口函數(shù)如下:
def handler(event, context):
return 'hello world'
當(dāng)有事件觸發(fā)的時候,就會從入口函數(shù)開始執(zhí)行,其中event參數(shù)攜帶了事件源相關(guān)的信息,比如在視頻處理場景中,event參數(shù)攜帶了上傳到OSS的Bucket以及文件名等信息。而context參數(shù)攜帶了函數(shù)的運行信息,包括函數(shù)名、超時時間、訪問憑證等。通過這些信息,就能讓執(zhí)行代碼完成預(yù)定義的各種操作。
函數(shù)計算支持各種主流的編程語言,在這個編程語言當(dāng)中,Node.js和Python等腳本型語言含了豐富的類庫,開發(fā)效率很高,而且運算實例啟動的速度很快,能夠支持對延遲特別敏感的任務(wù),是函數(shù)計算最匹配的語言。JAVA和Go等語言不能像腳本型語言一樣直接上傳代碼就能創(chuàng)建一個函數(shù),需要預(yù)先進行編譯,使用起來會稍微復(fù)雜一些,但配合函數(shù)計算提供的Funcraft等工具,也可以大幅度提升開發(fā)和部署的效率。不管使用哪種開發(fā)語言,都建議使用者下載官方提供的Funcraft工具,更輕松進行開發(fā)、構(gòu)建、部署操作,請參考Funcraft。
像Java這樣的語言,在虛擬機啟動的時候需要加載比較多的類庫,不能夠像實現(xiàn)運算實例毫秒級啟動并進入執(zhí)行狀態(tài),不能直接使用在一些對于延遲特別敏感的業(yè)務(wù)場景。但配合函數(shù)計算提供的預(yù)留實例以及單實例多并發(fā)新功能,能夠消除冷啟動對業(yè)務(wù)的影響,并降低等待下游服務(wù)響應(yīng)的影響,讓函數(shù)計算上運行的Java語言也能實現(xiàn)API網(wǎng)關(guān)等對延時要求特別高業(yè)務(wù)場景。請參考預(yù)留實例和單實例多并發(fā)。
Serverless工作流
通過前面介紹的方案,可以輕松完成對短視頻的各種定制化處理。但每一個函數(shù)計算實例,在資源規(guī)格上和總運行時長都不是無限的,目前函數(shù)計算實例可以擁有3G的內(nèi)存資源和10分鐘的執(zhí)行時間,這也就說明,當(dāng)一個視頻處理任務(wù)需要占用3G以上的系統(tǒng)內(nèi)存,或者總執(zhí)行時長超過10分鐘的情況下,處理任務(wù)是會失敗的。
在5G時代,超大視頻課件是非常普遍的需求,如何通過函數(shù)計算處理這樣的大視頻呢?這個時候就要出動另一個武器---Serverless工作流,來配合函數(shù)計算一起完成這個任務(wù)。
Serverless 工作流是一個用來協(xié)調(diào)多個分布式任務(wù)執(zhí)行的全托管云服務(wù)。您可以用順序、選擇、并行等方式來編排分布式任務(wù),Serverless 工作流會按照設(shè)定好的步驟可靠地協(xié)調(diào)任務(wù)執(zhí)行,跟蹤每個步驟的狀態(tài)轉(zhuǎn)換,并在必要時執(zhí)行用戶定義的重試邏輯,以確保工作流順利完成。Serverless 工作流通過提供日志記錄和審計來監(jiān)視工作流的執(zhí)行,方便您輕松地診斷和調(diào)試應(yīng)用。
您可以使用 Serverless 工作流編排一系列的函數(shù)資源,同時定義流程中每一步的輸入和輸出,使用內(nèi)置控制步驟編排復(fù)雜邏輯、發(fā)起并行執(zhí)行、管理超時或終止流程。另外通過控制臺能夠使用圖形界面顯示出執(zhí)行任務(wù)狀態(tài)和執(zhí)行順序,同時控制臺會顯示每個步驟的實時狀態(tài),并提供每次執(zhí)行的詳細歷史記錄。通過Serverless工作流 + 函數(shù)計算的組合,我們可以突破時間和空間的限制,對任意大小的視頻文件進行復(fù)雜的處理。
大視頻處理
簡單來講,處理一個大視頻的基本思路是:
(1)將視頻先進行切片處理,把每一個分片的大小控制在合理的大小,以便單個函數(shù)計算實例可以對其進行快速處理。
(2)拉起多個函數(shù)計算實例對每一個分片進行并行處理。
(3)對處理結(jié)果進行合并。
通過Serverless工作流 + 函數(shù)計算進行視頻處理的流程如下:
通過Serverless工作流提供的可視界面,我們能在工作流執(zhí)行的過程當(dāng)中,方便的查看到每一個步驟運行的信息,并配合自定義的Dashboard實現(xiàn)對整套視頻處理系統(tǒng)的全面監(jiān)控:
總結(jié)
基于函數(shù)計算和Serverless工作流的彈性高可用視頻處理架構(gòu),充分體現(xiàn)了云原生時代Serverless化思想,以事件驅(qū)動的形式觸發(fā)函數(shù)執(zhí)行,真實計算資源真正意義上的按需使用。
對于使用而言,這套方案在保證業(yè)務(wù)靈活度的同時,可以顯著降低維護成本與資源成本,并大幅度的縮短項目交付時間。
在線教育領(lǐng)域?qū)τ谝曨l處理的需求量非常大,而且對于處理速度、并發(fā)吞吐量、資源利用率等方面都有極高的要求,函數(shù)計算 + Serverless工作流方案組合幫助用戶輕松建設(shè)彈性高可用的視頻處理架構(gòu),是實現(xiàn)這些復(fù)雜需求的最優(yōu)解。隨著云原生的不斷發(fā)展,Serverless相關(guān)技術(shù)還將深入更多的業(yè)務(wù)場景,有未來有無限可能!