于述春, 趙嫦花, 何 佳
對(duì)于那些每個(gè)請(qǐng)求的業(yè)務(wù)處理量不大,但要支持大容量視頻訪問/播放的網(wǎng)站,采用傳統(tǒng)的并發(fā)處理的web服務(wù)器方案不能很好的解決問題.例如那些以增加訪問緩存為主要特點(diǎn)的方案[1-3],由于視頻文件顯然不適合于大量緩存,因而,在面對(duì)這類大量視頻播放要求的網(wǎng)站時(shí)就顯得不太適合.相反,如果是專門為視頻提供服務(wù),那么劉烈等提出的視頻服務(wù)器專門解決方案是可用的[4-7].
現(xiàn)在我們討論一種與上述情形不同的應(yīng)用場(chǎng)景:有少量的業(yè)務(wù)處理需要,同時(shí)又有大量的視頻訪問需要.這種應(yīng)用場(chǎng)景其中一個(gè)最主要的應(yīng)用就是在線教育類網(wǎng)站.如果將視頻移到專門的視頻服務(wù)器,但視頻又需要與web服務(wù)器其他信息關(guān)聯(lián).在這樣一類請(qǐng)求的業(yè)務(wù)處理要求不高,但視頻訪問量大的網(wǎng)絡(luò)應(yīng)用中,如何優(yōu)化或應(yīng)對(duì)高容量的視頻訪問,就成為系統(tǒng)構(gòu)架必須解決的一個(gè)關(guān)鍵問題.
針對(duì)這類網(wǎng)絡(luò)應(yīng)用,我們提出一種web服務(wù)器+一群nginx視頻服務(wù)器的方案.這個(gè)方案的特點(diǎn)是外部用戶只需訪問web網(wǎng)站,而實(shí)際上,用戶對(duì)視頻的訪問完全委托給那一群nginx視頻服務(wù)器處理.這種方案完全利用了如Apache和Tomcat等Web服務(wù)器強(qiáng)大的動(dòng)態(tài)內(nèi)容處理功能,以及Nginx高性能的靜態(tài)內(nèi)容訪問特點(diǎn)[8].
當(dāng)今網(wǎng)絡(luò)流量超過50%是視頻[9],許多網(wǎng)絡(luò)視頻采用流媒體技術(shù).這種技術(shù)使得用戶在播放視頻之前不需要完全下載視頻內(nèi)容,而可以邊播放邊下載.這種流媒體處理策略一般分為兩個(gè)階段:緩沖階段和穩(wěn)定狀態(tài)階段[10],在緩沖階段,主要是下載視頻幀信息到播放器緩沖區(qū);穩(wěn)定狀態(tài)階段主要是在緩沖區(qū)中視頻幀播放完之前從服務(wù)器下載新的視頻塊到緩沖區(qū).每個(gè)流服務(wù)一般以TCP長(zhǎng)連接方式實(shí)現(xiàn).
一般web請(qǐng)求采用HTTP協(xié)議傳輸,這類請(qǐng)求的特點(diǎn)是事務(wù)性的.據(jù)相關(guān)文獻(xiàn)報(bào)道,現(xiàn)在許多web請(qǐng)求包含有 javascript,css,xml等內(nèi)容,這些隨著 Ajax 技術(shù)的推廣而變得越來越普遍[11].因此,現(xiàn)在的web請(qǐng)求一般是采用動(dòng)態(tài)網(wǎng)頁技術(shù)進(jìn)行處理,需要后臺(tái)服務(wù)器有強(qiáng)大的處理功能.一般地,這些web請(qǐng)求(非視頻類的請(qǐng)求)數(shù)據(jù)量相比視頻流要少很多,但后臺(tái)處理功能要求強(qiáng)大.
因此,在開發(fā)Web應(yīng)用系統(tǒng)時(shí),需要根據(jù)應(yīng)用需要考慮是將視頻內(nèi)容與其他內(nèi)容一起在Web服務(wù)器呢,還是將視頻內(nèi)容與其他非視頻內(nèi)容分開處理.
如果Web應(yīng)用系統(tǒng)中視頻內(nèi)容很少或者沒有性能方面的考慮,可以直接將視頻內(nèi)容部署于web服務(wù)器上,用未經(jīng)優(yōu)化的TCP連接來傳輸視頻內(nèi)容.這種方案的優(yōu)點(diǎn)是簡(jiǎn)單節(jié)省.但如果Web應(yīng)用系統(tǒng)含有大量視頻內(nèi)容,還將視頻內(nèi)容與其他內(nèi)容一起由Web服務(wù)器處理,那么一方面會(huì)因視頻而極大影響Web請(qǐng)求響應(yīng)時(shí)間,另一方面視頻觀看總會(huì)出現(xiàn)卡頓現(xiàn)象,甚至很長(zhǎng)時(shí)間都播放不了.因此,一般的辦法是將視頻與其他非視頻的Web內(nèi)容分開處理.
將視頻和其他非視頻的內(nèi)容分開也可采用兩種辦法.一種辦法是將視頻上傳到專門的視頻服務(wù)網(wǎng)站如優(yōu)酷等,然后在自己的網(wǎng)站中提供這些視頻的超鏈接,這種辦法的優(yōu)點(diǎn)是明顯的,不需要與視頻相關(guān)的軟硬件投資,但其缺點(diǎn)是不靈活,不適合于那些視頻是由用戶上傳的情況.另一種辦法是在開發(fā)和部署Web應(yīng)用系統(tǒng)時(shí),分別部署視頻流媒體服務(wù)器和Web服務(wù)器,前者專門處理視頻,后者專門處理非視頻的Web請(qǐng)求.
在基于Web的應(yīng)用系統(tǒng)中,其訪問模式都是基于B/S模式的,因此,要求客戶端不需要專門的視頻播放器,而統(tǒng)一采用瀏覽器觀看視頻.Adobe Flash有專門的播放插件,只要流媒體格式為flv或mp4即可.而且由于flv格式的視頻在網(wǎng)絡(luò)視頻中占據(jù)主流[11],因此,選用這種格式的流媒體是正當(dāng)?shù)?
針對(duì)HTTP流媒體對(duì)apache和nginx等Web服務(wù)器作過測(cè)試,測(cè)試結(jié)果表明:nginx針對(duì)apache等Web服務(wù)器在HTTP流媒體方面有更好的性能[12].Nginx出色的性能以及對(duì)flv和mp4 HTTP流媒體的支持使它成為構(gòu)架流媒體服務(wù)器的不錯(cuò)的選擇[13].
因此,在有大量視頻的web應(yīng)用系統(tǒng)中,最具可擴(kuò)展性的方法是將視頻部分與一般的信息處理部分分開:將視頻播放與其他web信息分開,在不同機(jī)器上進(jìn)行,通過web系統(tǒng)對(duì)視頻進(jìn)行上傳或刪除等管理功能.
基于視頻與其他Web請(qǐng)求分開處理的策略,整個(gè)富視頻的Web應(yīng)用系統(tǒng)主要由四大模塊組成:nginx流媒體服務(wù)器,作為視頻播放服務(wù)器;web服務(wù)器,作為傳統(tǒng)的web服務(wù)器,處理除視頻播放外的其他業(yè)務(wù);視頻接收程序,在nginx服務(wù)器一端,接收由web服務(wù)器一端上傳的視頻,并向web服務(wù)器注冊(cè),以及獲取視頻截圖并將截圖返回web服務(wù)器;視頻發(fā)送程序,在web服務(wù)器一端,發(fā)送用戶上傳到web服務(wù)器的視頻,管理視頻接收程序的注冊(cè),接收回傳的視頻截圖.
圖1中,流媒體服務(wù)器即由nginx充當(dāng),web服務(wù)器即傳統(tǒng)的web系統(tǒng)服務(wù)器端,用戶上傳視頻或?yàn)g覽網(wǎng)頁只與web服務(wù)器交互,當(dāng)上傳的視頻文件到達(dá)web服務(wù)器時(shí),即由視頻發(fā)送程序?qū)⒁曨l發(fā)送到某個(gè)視頻服務(wù)器中;在視頻服務(wù)器一端,由視頻接收程序?qū)⒁曨l格式進(jìn)行一定的變換,并將轉(zhuǎn)換后的視頻格式文件保存到流媒體服務(wù)器所配置的目錄中,同時(shí)自動(dòng)從視頻中抓取截圖,并將截圖返回給視頻發(fā)送程序,后者再保存到相應(yīng)web目錄下,并相應(yīng)修改與web服務(wù)器共享的數(shù)據(jù)庫(kù)表.
圖1 Web服務(wù)器與流媒體服務(wù)器的分離
從圖1中還可看出,多個(gè)流服務(wù)器對(duì)應(yīng)一個(gè)web服務(wù)器,這也正是這個(gè)網(wǎng)絡(luò)視頻傳播的特點(diǎn):當(dāng)網(wǎng)站視頻數(shù)量增多或視頻觀看并發(fā)用戶訪問量增加時(shí),可通過部署更多的nginx流服務(wù)器進(jìn)擴(kuò)展.
nginx流服務(wù)器的主要作用是提供視頻播放時(shí)服務(wù)器端對(duì)流媒體的支持功能,其所支持的視頻格式有flv與mp4.
Nginx主要用作http服務(wù)器,但加入nginx_mod_h264_streaming-2.2.7和http_flv_module模塊后,即可支持flv和mp4格式的視頻,加入yamdi-1.4模塊即可拖動(dòng).
在從網(wǎng)上下載這些模塊并解壓后,可通過下述命令配置nginx,使其包含上述模塊:
configure
-add-module=../ngnix_mod_h264_streaming
--with-http_flv_module
為支持從視頻抓取截圖,需要ffmpeg軟件的支持,以下命令是配置ffmpeg的,其相應(yīng)模塊也需要從網(wǎng)上下載:
./configure -enable-mp3lame -enable-amr_nb-enable-amr_wb -enable-a52 -enable-xvid-enable-x264-enable-faad-enable-faac-enable-gpl-enable-libogg -enable-vorbis
最后是對(duì)nginx進(jìn)行配置:
server{
listen 80;
server_name serverIP;
root/flv/;
limit_rate_after 5m;
limit_rate512k;
index index.html;
charset utf-8;
#access_log logs/host.access.logmain;
location~.flv${
flv;
}
location~.mp4${
mp4;}
}
上述配置中,指定服務(wù)器偵聽端口為80,指定服務(wù)器IP,服務(wù)器視頻文件根目錄為/flv,而location~.flv$與location~.mp4表示服務(wù)器支持flv格式和mp4格式的視頻.
web服務(wù)器可使用任何傳統(tǒng)的開發(fā)web系統(tǒng)的平臺(tái)或工具開發(fā),如SSH2框架或tapestry框架或ASP.NET都可以.其主要功能是提供除視頻播放外的其他業(yè)務(wù)功能,也包括為注冊(cè)用戶或系統(tǒng)管理員提供視頻上傳功能.除此之外,還有其他一些業(yè)務(wù)處理功能.
下面只討論一下視頻上傳功能.在用傳統(tǒng)的文件上傳功能完成視頻上傳到web服務(wù)器后,web服務(wù)器將視頻文件根據(jù)系統(tǒng)要求進(jìn)行重命名,并將文件名保存到視頻信息表中,設(shè)置視頻移動(dòng)標(biāo)志為0,表示視頻文件還未移到視頻服務(wù)器.
在用戶訪問視頻鏈接時(shí),web服務(wù)器根據(jù)視頻信息表中移動(dòng)標(biāo)志是否為1來將相應(yīng)記錄中的視頻服務(wù)器IP地址和新視頻文件名取出,加入到相應(yīng)的視頻鏈接.當(dāng)用戶點(diǎn)擊這樣的視頻鏈接時(shí),用戶就可觀看相應(yīng)視頻.
圖2說明了平臺(tái)四大組件間的數(shù)據(jù)流傳遞關(guān)系.視頻發(fā)送程序從數(shù)據(jù)庫(kù)接收未發(fā)送到流媒體服務(wù)器的視頻信息,并將收到的截圖文件名更新到數(shù)據(jù)庫(kù),同時(shí)更新視頻文件移動(dòng)標(biāo)志;視頻接收程序接收由視頻發(fā)送程序從網(wǎng)絡(luò)發(fā)送的視頻文件;流媒體服務(wù)器只從所配置的視頻文件目錄中獲取視頻文件,視頻接收程序只將格式轉(zhuǎn)換后的視頻保存到該目錄.
圖2 四大模塊間的關(guān)系
視頻接收程序?qū)⒁院笈_(tái)進(jìn)程的方式運(yùn)行.
視頻接收程序的子模塊劃分如圖3所示.
圖3 視頻接收程序模塊圖
注冊(cè)模塊:向視頻發(fā)送程序發(fā)送注冊(cè)信息,注冊(cè)信息包括以下內(nèi)容:流媒體服務(wù)器IP地址,偵聽端口,流媒體服務(wù)器內(nèi)存大小,流媒體服務(wù)器空閑硬盤空間.以便視頻發(fā)送程序可根據(jù)各流媒體服務(wù)器的性能參數(shù)選擇適當(dāng)?shù)姆?wù)器接收新的視頻文件.同時(shí),注冊(cè)模塊在完成向視頻發(fā)送程序發(fā)送注冊(cè)信息后,將啟動(dòng)一個(gè)在線詢問回復(fù)線程,其作用是在視頻接收程序仍在運(yùn)行,但視頻發(fā)送程序重啟時(shí),由視頻發(fā)送程序主動(dòng)詢問視頻接收程序是否仍在線,若收到這樣的詢問(即收到“hello”),那么將回復(fù)“run”,表示視頻接收程序仍在線運(yùn)行.
文件接收線程:接收來自視頻發(fā)送程序所發(fā)送的視頻文件,雙方發(fā)送視頻文件的協(xié)議為:
(1)視頻發(fā)送程序發(fā)送視頻文件信息:文件名|格式|大小;
(2)視頻接收程序在正確接收到視頻文件信息時(shí),發(fā)送:ok
(3)視頻發(fā)送程序發(fā)送視頻文件
(4)視頻接收程序在正確接收視頻文件后,發(fā)送:success
然后視頻接收程序根據(jù)接收到的視頻文件名后綴確定視頻格式,如果視頻格式不是flv或mp4,則調(diào)用ffmpeg進(jìn)行必要的格式轉(zhuǎn)換,在轉(zhuǎn)換完成后,將新格式視頻保存到視頻目錄.然后啟動(dòng)圖像抓取與發(fā)送線程.
圖像發(fā)送線程:調(diào)用ffmpeg程序?qū)π罗D(zhuǎn)換的視頻文件或原格式的視頻抓取兩幅截圖,然后將截圖發(fā)送給視頻發(fā)送程序.截圖傳送協(xié)議是:
(1)圖像發(fā)送線程發(fā)送截圖個(gè)數(shù)及所屬視頻和新的視頻格式:個(gè)數(shù),視頻ID,新格式;
(2)視頻接收程序接收;
(3)圖像發(fā)送線程發(fā)送:圖像文件名,大小
(4)視頻接收程序接收到后,響應(yīng):ready
(5)圖像發(fā)送線程發(fā)送圖像文件本身;
(6)視頻接收程序接收后,如果不是最后一個(gè)圖像,響應(yīng):next;
接著重復(fù)流程(3)~(6).
視頻發(fā)送程序的功能是將web服務(wù)器收到的仍未移到某個(gè)視頻服務(wù)器的視頻文件發(fā)送到視頻服務(wù)器,并接收從該視頻中抓取的截圖,然后更新相應(yīng)數(shù)據(jù)庫(kù)表的對(duì)應(yīng)記錄.如果web服務(wù)器部署在windows平臺(tái),那么視頻發(fā)送程序?qū)⒆鳛橐粋€(gè)windows服務(wù)程序運(yùn)行;如果web服務(wù)器部署在linux平臺(tái),那么視頻發(fā)送程序?qū)⒆鳛橐粋€(gè)后臺(tái)進(jìn)行運(yùn)行.
在windows平臺(tái)下,采用C#語言開發(fā),以方便訪問數(shù)據(jù)庫(kù).
視頻發(fā)送程序的子模塊如圖4所示.
注冊(cè)接收線程:這個(gè)線程先從數(shù)據(jù)庫(kù)表中搜索曾經(jīng)有哪些視頻接收程序注冊(cè)過,然后向這些程序發(fā)送詢問消息“hello”,如果它們?cè)诰€,則以“run”響應(yīng),注冊(cè)接收線程將收到響應(yīng)的視頻接收程序的IP地址加入一個(gè)視頻接收者列表.在對(duì)曾注冊(cè)的視頻接收程序都詢問完后,啟動(dòng)一個(gè)線程,等待視頻接收程序主動(dòng)注冊(cè).
文件傳輸線程池:在windows平臺(tái),利用C#的ThreadPool組件完成線程池,設(shè)置線程池中線程最大可用個(gè)數(shù).每個(gè)線程的功能是將分配給它的一個(gè)視頻文件發(fā)送到視頻接收程序.它與視頻接收程序的通信協(xié)議已于前述,如果它在發(fā)送完視頻文件信息后,收到”refuse”,那么表示視頻服務(wù)器端已經(jīng)有此視頻文件,因而不用重傳,此時(shí)可直接更新數(shù)據(jù)庫(kù)視頻表的移動(dòng)標(biāo)志,放棄傳輸視頻文件.
正常情況下,在線程傳輸完一個(gè)視頻文件后,視頻接收程序如果返回”success”,那么線程將更新視頻表的移動(dòng)標(biāo)志及視頻服務(wù)器IP地址.
圖像接收線程:這個(gè)線程將接收從視頻服務(wù)器發(fā)來的視頻截圖,并將截圖文件名更新到視頻表相應(yīng)字段.由于視頻截圖發(fā)送時(shí)會(huì)發(fā)送視頻ID,因此,這個(gè)線程在接收到截圖后,即可更新特定視頻的截圖文件名.這些視頻截圖用于web服務(wù)器在列出視頻鏈接時(shí)給出相應(yīng)的視頻截圖.
這個(gè)程序的主要過程如下:
(1)查詢所有在線的視頻接收程序,將它們加入視頻服務(wù)器列表;
(2)啟動(dòng)注冊(cè)接收線程,將接收到的注冊(cè)視頻服務(wù)器加入視頻服務(wù)器列表,并同時(shí)插入數(shù)據(jù)庫(kù)表;
(3)啟動(dòng)圖像接收線程;
(4)查詢數(shù)據(jù)庫(kù)視頻表中移動(dòng)標(biāo)志為0的視頻記錄,放到待傳輸文件列表;
a)對(duì)每個(gè)待傳輸文件,從視頻服務(wù)器列表中找一個(gè)適合的服務(wù)器,啟動(dòng)一個(gè)文件傳輸線程,傳輸視頻文件;
b)睡眠 5秒,繼續(xù)(4).
測(cè)試平臺(tái)由兩臺(tái)計(jì)算機(jī)組成,一臺(tái)安裝windows 7,web服務(wù)器部署在其上,內(nèi)存4 G,硬盤500 G,100 Mbps局域網(wǎng);一臺(tái)安裝centos6.5,nginx服務(wù)器部署在其上,內(nèi)存也是4 G,200 G硬盤空間,連接100 Mbps局域網(wǎng).通過web服務(wù)器上傳5個(gè)大小在200~500 MB的視頻.
對(duì)比組:兩臺(tái)計(jì)算機(jī)的硬件配置完全相同,唯一不同的是,兩臺(tái)計(jì)算機(jī)部署相同的web系統(tǒng),且視頻也由web服務(wù)器處理.
上述的web應(yīng)用采用tomcat作為服務(wù)器.
測(cè)試過程:每個(gè)訪問web系統(tǒng)的同時(shí)也訪問視頻.訪問web系統(tǒng)需要進(jìn)行一些簡(jiǎn)單的業(yè)務(wù)處理.因此,測(cè)試過程中重點(diǎn)測(cè)試對(duì)視頻的訪問導(dǎo)致對(duì)web系統(tǒng)性能的影響.
測(cè)試結(jié)果如圖5所示.
上述結(jié)果中,對(duì)于僅采用web方式來處理業(yè)務(wù)請(qǐng)求和視頻訪問來說,如果web服務(wù)器不是選用tomcat,而是用nginx,可能會(huì)好得多.
上述結(jié)果說明:(1)將視頻交給nginx處理,在并發(fā)訪問視頻用戶數(shù)上升到某個(gè)數(shù)量時(shí),它會(huì)比由web服務(wù)器來提供視頻訪問有好得多的性能.
Ashwin Rao等[10]認(rèn)為nginx其開發(fā)就是解決C10K[14]問題,而Apache系列,也包括Tomcat就是不能很好地解決高并發(fā)條件下的web訪問性能.因此,采用nginx本身就比采用tomcat作為web服務(wù)器性能要好.故上述測(cè)試結(jié)果在視頻訪問量增加時(shí),nginx的性能要明顯好于tomcat.
同時(shí),在nginx中加入支持flv流媒體和mp4流媒體模塊,將nginx作為流媒體服務(wù)器,也得到廣泛認(rèn)可[15],而且還有很好的性能.
(2)一個(gè)web服務(wù)器+一群nginx流媒體服務(wù)器架構(gòu)具有很好的可擴(kuò)展性.上述測(cè)試雖然僅部署一臺(tái)nginx流媒體服務(wù)器,但隨著更大的并發(fā)視頻訪問量的到來,可再以同樣的方式部署一臺(tái)nginx流媒體服務(wù)器.而且新部署到系統(tǒng)的Nginx服務(wù)器對(duì)原服務(wù)器無任何影響,只是分擔(dān)更多的視頻的訪問.
這種可擴(kuò)展性還不能做到自動(dòng)化,還需要人工部署與配置.另外,這個(gè)方案也未提供訪問視頻時(shí)的用戶安全性檢查.如果惡意用戶保存合法用戶訪問某個(gè)視頻的鏈接,那么他也可訪問此視頻.這些都是有待改進(jìn)的地方.
[1]蔣文旭.基于nginx部署環(huán)境的Web加速方案設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2012:20-25.
[2]李艷生,汪自云.一種實(shí)用的海量Web系統(tǒng)架構(gòu)設(shè)計(jì)研究與實(shí)現(xiàn)[J].湖北師范學(xué)院學(xué)報(bào)(自然科學(xué)版),2009(4):87-90.
[3]戴華.基于nginx和memcached的高并發(fā)web服務(wù)器設(shè)計(jì)[D].上海:復(fù)旦大學(xué),2013:30-41.
[4]劉烈.基于linux的視頻服務(wù)器開發(fā)[D].濟(jì)南:濟(jì)南大學(xué),2012:31-37.
[5]羅文.基于http自適應(yīng)流媒體關(guān)鍵技術(shù)的研究及實(shí)現(xiàn)[D].南京:南京郵電大學(xué),2014:40-45.
[6]周怡兵.流媒體服務(wù)器軟件的設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:華中科技大學(xué),2011:32-37.
[7]董科軍,南凱,閻保平.一種可擴(kuò)展的集群流媒體服務(wù)器[J].計(jì)算機(jī)工程與應(yīng)用,2003(25):46-49.
[8]Walker Rowe.Nginx vs Apache[EB/OL].https://anturis.com/blog/nginx-vs-apache/.
[9]Sandvine.Global Internet phenomena report 1H 2014[EB/OL].https://www.sandvine.com/downloads/general/global-internetphenomena/2014/1h-2014-global-internet-phenomena-report.pdf.
[10]Ashwin Rao,Arnaud Legout,Yeon-sup Lim,et.ac.Network characteristics of video streaming traffic[C].Proceedings of Seventh Conference on emerging Networking Experiments and Technologies,2011.
[11]Sunghwan Ihm,Vivek S.Pai.Towardsunderstandingmodern web traffic[C].Proceedings of the 2011 ACM SIGCOMM Conference on Internet measurement conference:295-312.
[12]Jim Summers,Tim Brecht,Derek Eager,et.ac.Methodologies for generating HTTP streaming video workloads to evaluate web server performance[C].Proceedings of the 5th Annual International Systemsand Storage Conference,2012.
[13]Nginx.Streaming media delivery using nginx plus[EB/OL].https://www.nginx.com/products/streaming-media-delivery.
[14]Daniel Kegel.The C10Kproblem[EB/OL].http://www.kegel.com/c10k.html.
[15]NGINX Media Server-Amazon Linux AMI[EB/OL].https://aws.amazon.com/marketplace/pp/B00LIC1GPM/ref=mkt_wir_nginx_stream_media.