本發(fā)明涉及分布式轉(zhuǎn)碼系統(tǒng)、方法及其裝置。
背景技術(shù):
目前有一些為企業(yè)提供視頻托管服務(wù)的業(yè)務(wù),其中有一項(xiàng)服務(wù)便是將企業(yè)提供的高清視頻轉(zhuǎn)碼為適合互聯(lián)網(wǎng)進(jìn)行傳播的視頻流,在這個(gè)過程當(dāng)中就涉及到用戶在平臺上傳的視頻進(jìn)行轉(zhuǎn)碼的操作,由于涉及到的用戶和用戶視頻會非常的多,我們不可能使用單臺機(jī)器進(jìn)行轉(zhuǎn)碼,必須使用分布式的方式對用戶上傳的視頻進(jìn)行轉(zhuǎn)碼。
一般的框架設(shè)計(jì),通常會有一個(gè)任務(wù)中央任務(wù)調(diào)配系統(tǒng),配多個(gè)任務(wù)處理機(jī)器來進(jìn)行轉(zhuǎn)碼作業(yè),這種設(shè)計(jì)完全依賴中央任務(wù)調(diào)配系統(tǒng),這個(gè)系統(tǒng)可能會被過渡設(shè)計(jì),除了任務(wù)分配的調(diào)度,還需要實(shí)時(shí)對所有的工作機(jī)器進(jìn)行監(jiān)控來判斷是否分配任務(wù)到該工作機(jī);并且這個(gè)調(diào)度系統(tǒng)是非常重要,必須保證其高可用以確保該調(diào)度系統(tǒng)沒有單點(diǎn)故障風(fēng)險(xiǎn);而當(dāng)該中央調(diào)度系統(tǒng)作集群,本身就需要多臺機(jī)器部署,從而增加機(jī)器成本。
技術(shù)實(shí)現(xiàn)要素:
為了克服現(xiàn)有技術(shù)的不足,本發(fā)明的目的在于提供分布式轉(zhuǎn)碼系統(tǒng)、方法及其裝置,其能實(shí)現(xiàn)轉(zhuǎn)碼機(jī)器自身自行調(diào)度的分布式轉(zhuǎn)碼。
本發(fā)明的目的采用以下技術(shù)方案實(shí)現(xiàn):
分布式轉(zhuǎn)碼系統(tǒng),包括轉(zhuǎn)碼模塊、數(shù)據(jù)庫、共享文件系統(tǒng);
共享文件系統(tǒng)用于接收外部的請求端發(fā)送來的源文件并存儲;
數(shù)據(jù)庫用于接收外部的請求端發(fā)送來的任務(wù)數(shù)據(jù)包并存儲;
轉(zhuǎn)碼模塊用于從數(shù)據(jù)庫中獲取任務(wù)數(shù)據(jù)包,以及根據(jù)任務(wù)數(shù)據(jù)包從共享文件系統(tǒng)中獲取對應(yīng)的源文件,并對源文件進(jìn)行轉(zhuǎn)碼;將轉(zhuǎn)碼后的轉(zhuǎn)碼文件存儲至共享文件系統(tǒng)中。
分布式轉(zhuǎn)碼方法,應(yīng)用于分布式轉(zhuǎn)碼系統(tǒng),包括如下步驟:
S1、共享文件系統(tǒng)接收源文件并存儲;數(shù)據(jù)庫接收任務(wù)數(shù)據(jù)包并存儲;
S2、轉(zhuǎn)碼模塊的守護(hù)線程從數(shù)據(jù)庫中獲取任務(wù)數(shù)據(jù)包,并在轉(zhuǎn)碼模塊的工作池中創(chuàng)建一個(gè)轉(zhuǎn)碼進(jìn)程;工作池根據(jù)任務(wù)數(shù)據(jù)包中的轉(zhuǎn)碼源文件路徑從共享文件夾系統(tǒng)中獲取對應(yīng)的源文件;
S3、工作池對源文件進(jìn)行轉(zhuǎn)碼,將轉(zhuǎn)碼成功的轉(zhuǎn)碼文件存儲至共享文件系統(tǒng)中。
作為優(yōu)選,工作池包括心跳單元和轉(zhuǎn)碼單元;
S2具體為:守護(hù)線程從數(shù)據(jù)庫中獲取任務(wù)數(shù)據(jù)包,并在工作池中創(chuàng)建一個(gè)轉(zhuǎn)碼進(jìn)程;心跳單元定時(shí)發(fā)送心跳數(shù)據(jù)至數(shù)據(jù)庫中的任務(wù)數(shù)據(jù)包中,以使任務(wù)數(shù)據(jù)包中的心跳時(shí)間更新為接收到該心跳數(shù)據(jù)的時(shí)間;轉(zhuǎn)碼單元根據(jù)轉(zhuǎn)碼源文件路徑從共享文件夾系統(tǒng)中獲取對應(yīng)的源文件。
作為優(yōu)選,S2中的守護(hù)線程從數(shù)據(jù)庫中獲取待轉(zhuǎn)碼的任務(wù)數(shù)據(jù)包;以及從數(shù)據(jù)庫中獲取運(yùn)行中且心跳時(shí)間距離當(dāng)前時(shí)間超過預(yù)定時(shí)間的任務(wù)數(shù)據(jù)包。
作為優(yōu)選,守護(hù)線程還用于檢測工作池中的容量,并在工作池的容量有盈余時(shí),守護(hù)線程再次從數(shù)據(jù)庫中獲取任務(wù)數(shù)據(jù)包,并在工作池中創(chuàng)建另一個(gè)轉(zhuǎn)碼進(jìn)程。
作為優(yōu)選,S2還包括:工作池將獲取到的源文件存儲至緩存目錄中。
作為優(yōu)選,S3還包括:守護(hù)線程在轉(zhuǎn)碼單元轉(zhuǎn)碼成功后,發(fā)送轉(zhuǎn)碼成功信號至對應(yīng)的任務(wù)數(shù)據(jù)包中,并更新該任務(wù)數(shù)據(jù)包的狀態(tài)信息為完成。
作為優(yōu)選,守護(hù)線程還用于在轉(zhuǎn)碼單元轉(zhuǎn)碼失敗后,發(fā)送轉(zhuǎn)碼失敗信號至對應(yīng)的任務(wù)數(shù)據(jù)包中,更新該任務(wù)數(shù)據(jù)包的狀態(tài)信息為失敗。
作為優(yōu)選,S3中,工作池根據(jù)任務(wù)數(shù)據(jù)包中的轉(zhuǎn)碼需求對源文件進(jìn)行轉(zhuǎn)碼。
分布式轉(zhuǎn)碼裝置,應(yīng)用于分布式轉(zhuǎn)碼系統(tǒng),包括:
第一存儲模塊,應(yīng)用于共享文件系統(tǒng),用于接收源文件并存儲;第二存儲模塊,應(yīng)用于數(shù)據(jù)庫,用于接收任務(wù)數(shù)據(jù)包并存儲;
創(chuàng)建模塊,應(yīng)用于轉(zhuǎn)碼模塊的守護(hù)線程,用于從數(shù)據(jù)庫中獲取任務(wù)數(shù)據(jù)包,并在轉(zhuǎn)碼模塊的工作池中創(chuàng)建一個(gè)轉(zhuǎn)碼進(jìn)程;
獲取模塊,應(yīng)用于工作池,用于根據(jù)任務(wù)數(shù)據(jù)包中的轉(zhuǎn)碼源文件路徑從共享文件夾系統(tǒng)中獲取對應(yīng)的源文件;
運(yùn)行模塊,應(yīng)用于工作池,對源文件進(jìn)行轉(zhuǎn)碼,將轉(zhuǎn)碼成功的轉(zhuǎn)碼文件存儲至共享文件系統(tǒng)中。
相比現(xiàn)有技術(shù),本發(fā)明的有益效果在于:將中央任務(wù)調(diào)配系統(tǒng)去除,由各個(gè)轉(zhuǎn)碼機(jī)器本身來實(shí)現(xiàn)自行調(diào)度,從而減少了發(fā)生故障的風(fēng)險(xiǎn),節(jié)省機(jī)器成本的投入,降低后期維護(hù)的難度。
附圖說明
圖1為本發(fā)明的分布式轉(zhuǎn)碼系統(tǒng)的模塊連接圖;
圖2為本發(fā)明的分布式轉(zhuǎn)碼方法的流程圖;
圖3為本發(fā)明的分布式轉(zhuǎn)碼裝置的模塊連接圖。
具體實(shí)施方式
下面,結(jié)合附圖以及具體實(shí)施方式,對本發(fā)明做進(jìn)一步描述:
分布式轉(zhuǎn)碼系統(tǒng),如圖1所示,包括轉(zhuǎn)碼機(jī)器、數(shù)據(jù)庫、共享文件系統(tǒng)和傳輸組件;
傳輸組件用于接收需要進(jìn)行轉(zhuǎn)碼的源文件和任務(wù)數(shù)據(jù)包,并將源文件存儲至共享文件系統(tǒng)中的源文件模塊中,以及將任務(wù)數(shù)據(jù)包存儲至數(shù)據(jù)庫的任務(wù)池中。每個(gè)任務(wù)數(shù)據(jù)包括了任務(wù)ID、轉(zhuǎn)碼源文件路徑、狀態(tài)信息(初始為“待轉(zhuǎn)碼”)、心跳時(shí)間、轉(zhuǎn)碼目標(biāo)文件路徑、轉(zhuǎn)碼需求、轉(zhuǎn)碼工作機(jī)等信息。
轉(zhuǎn)碼機(jī)器中設(shè)有轉(zhuǎn)碼模塊,轉(zhuǎn)碼模塊從數(shù)據(jù)庫中的任務(wù)池中獲取的任務(wù)數(shù)據(jù)包,并發(fā)送心跳數(shù)據(jù)至任務(wù)池中對應(yīng)的任務(wù)數(shù)據(jù)包中更新心跳時(shí)間,以及根據(jù)任務(wù)數(shù)據(jù)包的轉(zhuǎn)碼源文件路徑從共享文件系統(tǒng)中的源文件模塊中獲取對應(yīng)的源文件。每個(gè)轉(zhuǎn)碼機(jī)器中設(shè)有多個(gè)轉(zhuǎn)碼模塊。
轉(zhuǎn)碼模塊根據(jù)任務(wù)數(shù)據(jù)包和源文件進(jìn)行轉(zhuǎn)碼,同時(shí)將源文件存儲至轉(zhuǎn)碼機(jī)器的緩存目錄中。轉(zhuǎn)碼模塊將轉(zhuǎn)碼成功的轉(zhuǎn)碼文件存儲至共享文件系統(tǒng)中的轉(zhuǎn)碼文件模塊中,并發(fā)送轉(zhuǎn)碼成功信號至數(shù)據(jù)庫中的任務(wù)池中對應(yīng)的任務(wù)數(shù)據(jù)包中,更新該任務(wù)數(shù)據(jù)包的狀態(tài)信息為完成。
有些情況下,例如源文件的格式不支持,或者源文件損壞等原因,轉(zhuǎn)碼模塊無法將該源文件轉(zhuǎn)碼,那么轉(zhuǎn)碼就會失敗,此時(shí)轉(zhuǎn)碼模塊會將任務(wù)標(biāo)識為失敗,并且不作任何的文件拷貝動作。
分布式轉(zhuǎn)碼方法,應(yīng)用于分布式轉(zhuǎn)碼系統(tǒng),如圖2所示,包括如下步驟:
步驟100、傳輸組件接收外部的請求端發(fā)送來的需要進(jìn)行轉(zhuǎn)碼的源文件和任務(wù)數(shù)據(jù)包,并將源文件存儲至共享文件系統(tǒng)中,以及將任務(wù)數(shù)據(jù)包存儲至數(shù)據(jù)庫中;
具體的,將源文件存儲之共享文件系統(tǒng)中的源文件模塊中;以及將任務(wù)數(shù)據(jù)包存儲至數(shù)據(jù)庫的任務(wù)池中;每個(gè)任務(wù)數(shù)據(jù)包包括任務(wù)ID、轉(zhuǎn)碼源文件路徑、狀態(tài)信息、心跳時(shí)間、轉(zhuǎn)碼目標(biāo)文件路徑、轉(zhuǎn)碼需求和轉(zhuǎn)碼工作機(jī);狀態(tài)信息包括:待轉(zhuǎn)碼、運(yùn)行中、完成和失敗。
步驟101、轉(zhuǎn)碼模塊從數(shù)據(jù)庫中獲取任務(wù)數(shù)據(jù)包,并創(chuàng)建一個(gè)轉(zhuǎn)碼進(jìn)程,轉(zhuǎn)碼模塊定時(shí)發(fā)送心跳數(shù)據(jù)至任務(wù)池中對應(yīng)的任務(wù)數(shù)據(jù)包中,以及根據(jù)轉(zhuǎn)碼源文件路徑從共享文件夾系統(tǒng)中獲取對應(yīng)的源文件。
轉(zhuǎn)碼模塊包括守護(hù)線程和工作池;工作池包括心跳單元和轉(zhuǎn)碼單元。具體的,轉(zhuǎn)碼模塊的守護(hù)線程從任務(wù)池中獲取任務(wù)數(shù)據(jù)包,并在工作池中創(chuàng)建一個(gè)轉(zhuǎn)碼進(jìn)程,工作池的心跳單元定時(shí)發(fā)送心跳數(shù)據(jù)至任務(wù)池中對應(yīng)的任務(wù)數(shù)據(jù)包中,以及轉(zhuǎn)碼單元根據(jù)轉(zhuǎn)碼源文件路徑從共享文件夾系統(tǒng)中獲取對應(yīng)的源文件。
轉(zhuǎn)碼源文件路徑和共享文件夾系統(tǒng)中源文件模塊相對應(yīng),轉(zhuǎn)碼模塊可以根據(jù)轉(zhuǎn)碼源文件路徑從共享文件夾系統(tǒng)的源文件模塊中獲取對應(yīng)的源文件。
轉(zhuǎn)碼模塊發(fā)送心跳數(shù)據(jù)具體為:轉(zhuǎn)碼模塊定時(shí)發(fā)送一個(gè)心跳數(shù)據(jù)至任務(wù)數(shù)據(jù)包,心跳時(shí)間更新為接收到心跳數(shù)據(jù)的時(shí)間。例如,轉(zhuǎn)碼模塊每隔30s發(fā)送一個(gè)心跳數(shù)據(jù)至任務(wù)數(shù)據(jù)包,轉(zhuǎn)碼模塊在06:00:20第一次發(fā)送一次心跳數(shù)據(jù)至任務(wù)數(shù)據(jù)包,心跳時(shí)間更新為06:00:20;轉(zhuǎn)碼模塊在06:00:50第二次發(fā)送心跳數(shù)據(jù)包至任務(wù)數(shù)據(jù)包,心跳時(shí)間更新為06:00:50。
進(jìn)一步地,轉(zhuǎn)碼模塊從任務(wù)池中獲取任務(wù)數(shù)據(jù)包;該任務(wù)數(shù)據(jù)包的狀態(tài)信息為待轉(zhuǎn)碼,或狀態(tài)信息為運(yùn)行中且心跳時(shí)間距離當(dāng)前時(shí)間超過預(yù)定時(shí)間。例如,預(yù)定時(shí)間是3分鐘,當(dāng)前時(shí)間為06:05:00,而某一任務(wù)數(shù)據(jù)包的心跳時(shí)間為06:01:20;此時(shí)心跳時(shí)間距離當(dāng)前時(shí)間超過三分鐘,故轉(zhuǎn)碼模塊從任務(wù)池中獲取該任務(wù)數(shù)據(jù)包。
進(jìn)一步地,守護(hù)線程還用于檢測工作池中的容量,如果工作池中的容量有盈余,守護(hù)線程會從數(shù)據(jù)庫中再次獲取任務(wù)數(shù)據(jù)包,在工作池中創(chuàng)建另一個(gè)轉(zhuǎn)碼進(jìn)程。例如,每個(gè)工作池的容量為可以創(chuàng)建10個(gè)轉(zhuǎn)碼進(jìn)程,而此時(shí)工作池中有7個(gè)轉(zhuǎn)碼進(jìn)程,則守護(hù)線程可以再次從數(shù)據(jù)庫中獲取任務(wù)數(shù)據(jù)包,再次創(chuàng)建轉(zhuǎn)碼進(jìn)程。
步驟102、轉(zhuǎn)碼模塊對源文件進(jìn)行轉(zhuǎn)碼,將轉(zhuǎn)碼成功的轉(zhuǎn)碼文件存儲至共享文件系統(tǒng)中。
具體的,轉(zhuǎn)碼單元根據(jù)任務(wù)數(shù)據(jù)包中的轉(zhuǎn)碼需求對源文件進(jìn)行轉(zhuǎn)碼;例如,任務(wù)需求是將源文件轉(zhuǎn)碼成格式為高清的rmvb格式的文件,或者格式為超清的mp4格式的文件。
進(jìn)一步地,轉(zhuǎn)碼單元還將源文件存儲至轉(zhuǎn)碼模塊所在的轉(zhuǎn)碼機(jī)器的緩存目錄中;將轉(zhuǎn)碼成功的轉(zhuǎn)碼文件存儲至共享文件系統(tǒng)的轉(zhuǎn)碼文件模塊中。
進(jìn)一步地,守護(hù)線程在轉(zhuǎn)碼單元轉(zhuǎn)碼成功后,發(fā)送轉(zhuǎn)碼成功信號至任務(wù)池中對應(yīng)的任務(wù)數(shù)據(jù)包中,更新該任務(wù)數(shù)據(jù)包的狀態(tài)信息為完成。
進(jìn)一步地,轉(zhuǎn)碼模塊還用于將轉(zhuǎn)碼失敗后發(fā)送轉(zhuǎn)碼失敗信號至任務(wù)池中對應(yīng)的任務(wù)數(shù)據(jù)包中,更新該任務(wù)數(shù)據(jù)包的狀態(tài)信息為失敗。
以下將對各個(gè)模塊進(jìn)行詳細(xì)的解釋:
共享文件系統(tǒng)(Sharing File System),該系統(tǒng)提供接口,傳輸組件和所有轉(zhuǎn)碼模塊都依賴該接口來存取文件。在本實(shí)施例中,共享文件系統(tǒng)使用的是亦云公司提供的XNODE共享文件存儲系統(tǒng)。
數(shù)據(jù)庫(Data Base),用于存儲任務(wù)數(shù)據(jù)包,該系統(tǒng)提供接口,傳輸組件和所有轉(zhuǎn)碼模塊都依賴該系統(tǒng)的接口來保存和查詢相關(guān)的任務(wù)數(shù)據(jù)包。在本實(shí)施例中,數(shù)據(jù)庫使用的是開源的MySQL服務(wù)。
傳輸組件(Transcode Request Server),這個(gè)組件是接收轉(zhuǎn)碼請求的組件,該組件的主要職責(zé)是將需要轉(zhuǎn)碼的源文件寫入到共享目錄當(dāng)中,同時(shí)在數(shù)據(jù)庫中創(chuàng)建一條任務(wù)數(shù)據(jù)包,并將狀態(tài)信息設(shè)為“待轉(zhuǎn)碼”,由于工作內(nèi)容簡單,在實(shí)際的應(yīng)用過程當(dāng)中,這部分的邏輯甚至不需要有一個(gè)單獨(dú)的進(jìn)程處理。在本實(shí)施例中,該組件集成到了處理客戶請求的WebApp Server當(dāng)中。
轉(zhuǎn)碼模塊(Transcode Worker),是轉(zhuǎn)碼工作實(shí)際執(zhí)行的組件,轉(zhuǎn)碼模塊的設(shè)計(jì)為無狀態(tài)組件,可以隨意伸縮,這個(gè)取決于當(dāng)前數(shù)據(jù)庫中的任務(wù)隊(duì)列數(shù)量和組件的空轉(zhuǎn)情況。
任務(wù)池(Task Pool),存在于數(shù)據(jù)庫中的一個(gè)工作表,任務(wù)池包括多個(gè)任務(wù)數(shù)據(jù)包,記錄了需要轉(zhuǎn)碼的任務(wù)數(shù)據(jù)包,每個(gè)任務(wù)數(shù)據(jù)包括了任務(wù)ID、轉(zhuǎn)碼源文件路徑、狀態(tài)信息(初始為“待轉(zhuǎn)碼”)、任務(wù)心跳、轉(zhuǎn)碼目標(biāo)文件路徑、轉(zhuǎn)碼工作機(jī)等信息。其中,任務(wù)心跳包要求當(dāng)前的轉(zhuǎn)碼工作機(jī)定時(shí)更新(通常為30s),如果任務(wù)心跳包最后更新的時(shí)間距離當(dāng)前時(shí)間超過3分鐘,則該任務(wù)數(shù)據(jù)包異常,該任務(wù)會被其他轉(zhuǎn)碼模塊獲取,并從新開始轉(zhuǎn)碼。
源文件模塊(Origin File),設(shè)于共享文件系統(tǒng)中,用于存放需要轉(zhuǎn)碼的源文件目錄。
任務(wù)心跳包(Transcoded File),設(shè)于共享文件系統(tǒng)中,用于存放轉(zhuǎn)碼完成的目標(biāo)文件目錄。
守護(hù)線程(Daemon Thread),該線程會定時(shí)掃描數(shù)據(jù)庫中任務(wù)池里的任務(wù)數(shù)據(jù)包,并把該任務(wù)放入本機(jī)的工作池當(dāng)中。
工作池(Working Pool),用于存放正在工作的轉(zhuǎn)碼任務(wù),每個(gè)轉(zhuǎn)碼模塊的工作池的大小會依據(jù)當(dāng)前轉(zhuǎn)碼機(jī)器的空閑CPU核數(shù)來確定。一個(gè)雙核CPU機(jī)器完全用來轉(zhuǎn)碼的話,那么工作池就是2,表示當(dāng)前的工作節(jié)點(diǎn)能同時(shí)進(jìn)行2個(gè)轉(zhuǎn)碼任務(wù)。
Task Thread:進(jìn)行轉(zhuǎn)碼工作的線程,包含2個(gè)子模塊,一個(gè)是轉(zhuǎn)碼模塊,核心的業(yè)務(wù)模塊,用來將一種視頻格式轉(zhuǎn)碼為另一種視頻格式。另一個(gè)模塊是Heartbeat(心跳)模塊,只要工作進(jìn)程正常運(yùn)行,心跳線程就會不斷的更新數(shù)據(jù)庫中該條任務(wù)的心跳時(shí)間。
分布式轉(zhuǎn)碼裝置,如圖3所示,應(yīng)用于分布式轉(zhuǎn)碼系統(tǒng),包括:
第一存儲模塊,應(yīng)用于共享文件系統(tǒng),用于接收源文件并存儲;第二存儲模塊,應(yīng)用于數(shù)據(jù)庫,用于接收任務(wù)數(shù)據(jù)包并存儲;
創(chuàng)建模塊,應(yīng)用于轉(zhuǎn)碼模塊的守護(hù)線程,用于從數(shù)據(jù)庫中獲取任務(wù)數(shù)據(jù)包,并在轉(zhuǎn)碼模塊的工作池中創(chuàng)建一個(gè)轉(zhuǎn)碼進(jìn)程;
獲取模塊,應(yīng)用于工作池,用于根據(jù)任務(wù)數(shù)據(jù)包中的轉(zhuǎn)碼源文件路徑從共享文件夾系統(tǒng)中獲取對應(yīng)的源文件;
運(yùn)行模塊,應(yīng)用于工作池,對源文件進(jìn)行轉(zhuǎn)碼,將轉(zhuǎn)碼成功的轉(zhuǎn)碼文件存儲至共享文件系統(tǒng)中。
對本領(lǐng)域的技術(shù)人員來說,可根據(jù)以上描述的技術(shù)方案以及構(gòu)思,做出其它各種相應(yīng)的改變以及形變,而所有的這些改變以及形變都應(yīng)該屬于本發(fā)明權(quán)利要求的保護(hù)范圍之內(nèi)。