馬邦陽,魏偉剛,浦云明,尤志寧,王 巍,陳凱萌
(1.集美大學(xué)網(wǎng)絡(luò)中心,福建 廈門 361021;2.集美大學(xué)計(jì)算機(jī)工程學(xué)院,福建 廈門 361021)
網(wǎng)絡(luò)上直播數(shù)據(jù)的請(qǐng)求和傳輸都要通過網(wǎng)絡(luò)直播服務(wù)器處理,當(dāng)用戶過多,服務(wù)器即處于過載狀態(tài),響應(yīng)速度也會(huì)隨之下降,出現(xiàn)網(wǎng)絡(luò)延遲。王彥輝等[1]基于立方體網(wǎng)絡(luò)結(jié)構(gòu),進(jìn)行了網(wǎng)絡(luò)傳輸延遲分析,認(rèn)為網(wǎng)絡(luò)中存儲(chǔ)和轉(zhuǎn)發(fā)都要耗費(fèi)一定的系統(tǒng)資源,因而信息傳輸節(jié)點(diǎn)數(shù)決定了通信效率的高低。越來越多研究關(guān)注用戶訪問和服務(wù)器的交互作用。李銳等[2]從負(fù)載均衡性方面出發(fā),研究了分布式緩存副本策略,匹配服務(wù)器處理性能最大化利用緩存資源。張國強(qiáng)等[3]研究了ICN(信息中心網(wǎng)絡(luò))緩存網(wǎng)絡(luò)中緩存大小規(guī)劃、應(yīng)用無關(guān)的緩存空間共享機(jī)制、緩存決策策略、網(wǎng)絡(luò)內(nèi)置緩存對(duì)象的可用性以及緩存網(wǎng)絡(luò)的理論模型和性能優(yōu)化方法等。蔡君等[4]研究了ICN全網(wǎng)內(nèi)置緩存架構(gòu),為使被緩存的內(nèi)容對(duì)象在空間和時(shí)間上分布更合理,提出了一種基于節(jié)點(diǎn)社團(tuán)重要度的緩存策略(CSNIC),保證了不同流行度內(nèi)容對(duì)象在各社團(tuán)內(nèi)節(jié)點(diǎn)處的時(shí)間分布的合理性?,F(xiàn)有的相關(guān)研究工作,各類緩存策略都側(cè)重于提高系統(tǒng)整體性能,而在企業(yè)實(shí)際的應(yīng)用中,為解決網(wǎng)絡(luò)中來回傳送數(shù)據(jù)的問題,一般使用緩存設(shè)備實(shí)現(xiàn)本地存儲(chǔ),同時(shí)緩存設(shè)備與源服務(wù)器進(jìn)行刷新檢驗(yàn),以保證存儲(chǔ)在緩存中數(shù)據(jù)的時(shí)效性。
ATS(apache traffic server)是模塊化的Http網(wǎng)絡(luò)代理緩存服務(wù)器。ATS緩存包括一個(gè)高速的對(duì)象數(shù)據(jù)庫,數(shù)據(jù)庫根據(jù)用戶請(qǐng)求的URL和請(qǐng)求頭部中相關(guān)的參數(shù)來組成對(duì)應(yīng)的Key,用于索引對(duì)象[5]。李潤(rùn)知等[8]研究了緩存的新鮮度及數(shù)據(jù)分片點(diǎn)擊率等指標(biāo),評(píng)估節(jié)點(diǎn)緩存空間利用率,提出了頻度限制的緩存替換算法。在新鮮度檢測(cè)中,如果內(nèi)容新鮮,則ATS會(huì)向客戶端發(fā)送回復(fù)標(biāo)頭;否則流量服務(wù)器將打開到源服務(wù)器的連接,請(qǐng)求內(nèi)容并檢測(cè)資源新鮮度。如果資源新鮮,ATS將該對(duì)象發(fā)給用戶,如果資源不新鮮,則ATS緩存新鮮的對(duì)象并轉(zhuǎn)發(fā)給用戶。在任何階段出現(xiàn)錯(cuò)誤,Http狀態(tài)機(jī)將跳轉(zhuǎn)到“Send Reply Header”狀態(tài)并發(fā)送回復(fù),如果回復(fù)錯(cuò)誤,則事務(wù)關(guān)閉。當(dāng)客戶端向服務(wù)器請(qǐng)求一個(gè)資源時(shí),當(dāng)資源在其他網(wǎng)絡(luò)位置,服務(wù)器向客戶端打回一個(gè)重定向的回復(fù),客戶端根據(jù)該回復(fù)去正確的URL獲取資源[9]。
ATS自身沒有直播代理的功能,因此,系統(tǒng)需要開發(fā)直播代理的插件。ATS插件開發(fā)是基于協(xié)程TSCont、鉤子Hook和事件池來實(shí)現(xiàn)的。本文采用基于ATS的網(wǎng)絡(luò)直播加速緩存系統(tǒng)設(shè)計(jì),以期解決網(wǎng)絡(luò)直播的延時(shí)和卡頓問題,同時(shí)也減少網(wǎng)絡(luò)的負(fù)載。
在ATS緩存系統(tǒng)中,主要是設(shè)計(jì)事務(wù)處理模塊,圖1為系統(tǒng)獲取關(guān)鍵字流程,主要功能是調(diào)用Boost庫獲取關(guān)鍵字、檢索關(guān)鍵字、源站請(qǐng)求資源、給用戶發(fā)送資源等[10]。
1)獲取關(guān)鍵字:由于ATS中的資源都是以關(guān)鍵字唯一表示,而關(guān)鍵字又是從用戶的請(qǐng)求中獲取的,因此,處理模塊首先請(qǐng)求、獲取關(guān)鍵字。
2)檢索關(guān)鍵字:獲取關(guān)鍵字之后,對(duì)關(guān)鍵字進(jìn)行檢索,查看該資源是否存在于本地,若存在,則給用戶發(fā)送該資源,如果不存在,則ATS將會(huì)去源站進(jìn)行請(qǐng)求,先獲取該資源,再將該資源發(fā)送給用戶。
3)去源站請(qǐng)求資源:當(dāng)用戶請(qǐng)求的資源本地不存在時(shí),ATS將會(huì)去源站資源請(qǐng)求。
4)給用戶發(fā)送資源。
獲取關(guān)鍵字是事務(wù)處理的第一步,為后續(xù)模塊處理做準(zhǔn)備,主要是創(chuàng)建功能對(duì)象和回調(diào)函數(shù),發(fā)送到ATS的請(qǐng)求事務(wù)一旦觸發(fā)就進(jìn)入回調(diào)函數(shù)。功能入口代碼為:
if(GLB_CONFIG_MANAGER().get_global_block().pattern_store_switch)
//判斷過去關(guān)鍵字模塊功能是否開啟{
m_store_url_sp=hm_store_url::create(); //創(chuàng)建功能對(duì)象
m_store_contp=TSContCreate(hm_store_url::store_url_event_cb,0);
//創(chuàng)建回調(diào)函數(shù)store_url_event_cb
TSContDataSet(m_store_contp,m_store_url_sp.get());
TSHttpHookAdd(TS_HTTP_POST_REMAP_HOOK,m_store_contp);
//添加全局鉤子,觸發(fā)鉤子進(jìn)入回調(diào)函數(shù)}
代碼中,GLB_CONFIG_MANAGER().get_global_block().pattern_store_switch的返回值為一個(gè)布爾值,它代表store_url功能的開關(guān),1表示開,0表示關(guān)。store_url功能是提取關(guān)鍵字功能,用來表示和存儲(chǔ)資源。
URL關(guān)鍵字提取規(guī)則在配置文件中配置,URL的匹配和存儲(chǔ)都是以正則表達(dá)式來處理的。當(dāng)ATS接收到請(qǐng)求時(shí)將會(huì)調(diào)用該功能,并將結(jié)果寫到日志文件storeurl.log中。日志字段包括:用戶請(qǐng)求時(shí)間、用戶所在的網(wǎng)絡(luò)IP地址、用戶請(qǐng)求的URL、提取的關(guān)鍵字。
項(xiàng)目中創(chuàng)建一個(gè)Map 用來存放已存在于本地的資源,創(chuàng)建代碼為:
Typedef boost::unordered_map
video_stream_hash_container m_stream_grp;
檢索部分的代碼為:
int video_stream_manage::setup_request(main_state *ms, int &client_num){
simple_recursive_guard lock(m_stream_mutex); //程序加鎖
video_stream_hash_iterator iter=m_stream_grp.find(ms->store_key);
if(iter == m_stream_grp.end())
return CTS_HLRS_MISS; //資源不存在
else
return CTS_HLRS_HIT;//返回檢索結(jié)果hit,資源存在}
當(dāng)用戶所請(qǐng)求的資源不存在于本地時(shí),返回CTS_HLRS_MISS,否則返回CTS_HLRS_HIT,系統(tǒng)會(huì)自動(dòng)統(tǒng)計(jì)請(qǐng)求一個(gè)資源的用戶數(shù)量。然后將其寫入日志文件videolive.log中,日志信息包括:用戶所在網(wǎng)絡(luò)IP、狀態(tài)碼、同時(shí)請(qǐng)求該資源的用戶數(shù)、用戶請(qǐng)求的原URL。狀態(tài)碼為HTTP_LIVE_HIT表示用戶請(qǐng)求的資源存在于本地,為HTTP_LIVE_MISS表示用戶請(qǐng)求的資源本地沒有,為HTTP_LIVE_FETCH表示ATS無法從源站獲取資源。
數(shù)據(jù)的回源指的是當(dāng)ATS 接收到用戶的數(shù)據(jù)請(qǐng)求,本地又沒有該數(shù)據(jù)資源,此時(shí)ATS 需要到源站請(qǐng)求數(shù)據(jù)到本地。程序插件需構(gòu)建請(qǐng)求頭部、創(chuàng)建與源站的連接、解析源站回復(fù)的數(shù)據(jù)。
1)構(gòu)建請(qǐng)求頭部,請(qǐng)求頭部的構(gòu)建主要有兩個(gè)方法:
①voidvideo_live_stream::init_fetch_request(main_state *ms);
該方法的主要功能是初始化構(gòu)造頭部過程中所需要用到的參數(shù),如源站的Host和請(qǐng)求的URL。需要注意的是在該方法中獲取到了用戶的IP地址和端口號(hào),并存放在m_client_addr成員內(nèi)。
②voidvideo_live_stream::build_request_line(TSHttpTxn txnp,std::string &request_line)
該方法是創(chuàng)建對(duì)源站進(jìn)行請(qǐng)求的Request,將所需要用到的參數(shù)、主機(jī)地址、資源的URL等盡心拼接。并將結(jié)果放入Request_Line。
2)創(chuàng)建與源站的連接,創(chuàng)建連接使用了ATS的API。
voidvideo_fetch_request::start_connect(const struct sockaddr *addr){
//創(chuàng)建用于處理數(shù)據(jù)傳輸?shù)幕卣{(diào)函數(shù);
//建立讀區(qū)源站回復(fù)的數(shù)據(jù)通道;
//建立寫入連接的數(shù)據(jù)通道;}
通過該方法建立與源站的連接,M_Req_Reader存放著與源站建立連接的Request。將該Request寫入連接M_Http_Vc就可建立與源站的連接。
3)解析源站回復(fù)的數(shù)據(jù),包括回復(fù)頭部信息的解析和內(nèi)容解析。
int video_fetch_request::handle_vconn_read_ready();
給用戶發(fā)送數(shù)據(jù)首先要建立連接,然后建立數(shù)據(jù)傳輸通道,最后發(fā)送數(shù)據(jù)。
1)連接的建立:通過ATS提供的API接口來建立與客戶端的連接。
voidvideo_live_session::start_connect(){
m_contp=TSContCreate(video_live_session::state_video_live_event,TSMutexCreate()); //封裝回調(diào)函數(shù)
TSContDataSet(m_contp,this); //設(shè)置回調(diào)函數(shù)的傳入數(shù)據(jù)
TSHttpTxnIntercept(m_contp,m_txnp); //接管事務(wù)}
TSHttpTxnIntercept函數(shù)的作用是ATS服務(wù)器接管事務(wù),同時(shí)生成一個(gè)與客戶端的連接TSVConn。
2)創(chuàng)建數(shù)據(jù)傳輸通道。
int video_live_session::handle_accept_event(TSCont contp,TSEvent event,
void *edata){
//PluginVC
m_net_vc =(TSVConn)edata;
//edata是調(diào)用TSHttpTxnIntercept生成的連接,其類型是TSVConn
m_req_buffer=TSIOBufferCreate();
m_resp_buffer=TSIOBufferCreate();
m_resp_reader=TSIOBufferReaderAlloc(m_resp_buffer); //封裝緩存區(qū)
m_read_vio=TSVConnRead(m_net_vc,contp,m_req_buffer,INT64_MAX);
return 0;}
m_write_vio=TSVConnWrite(m_net_vc,m_contp,m_resp_reader,INT64_MAX);
上述代碼創(chuàng)建了數(shù)據(jù)傳輸通道M_Write_Vio,M_Resp_Reader 為封裝過后的數(shù)據(jù)緩存區(qū)。只要將數(shù)據(jù)寫入該緩存區(qū)就可以實(shí)現(xiàn)向用戶發(fā)送數(shù)據(jù)。
3)發(fā)送數(shù)據(jù)。
voidvideo_live_session::produce_output(const void *data,int64_t length)
系統(tǒng)最低硬件環(huán)境:CPU 2.40GHz以上;RAM 4G以上;Disk空間512G以上。當(dāng)服務(wù)用戶較多時(shí),硬件要求也要隨之提高,否則服務(wù)器容易過載。管理員應(yīng)監(jiān)控服務(wù)器的負(fù)荷情況,特別是直播高峰期時(shí)應(yīng)做適當(dāng)?shù)呢?fù)載均衡。軟件環(huán)境:CentOS 6.5、Python2.7、CURL開發(fā)工具、Tcpdump開發(fā)工具、Gcc、G++、Boost1.56開發(fā)工具。
本研究采集了基于ATS緩存系統(tǒng)的一天、一周和一月的流量數(shù)據(jù),數(shù)據(jù)來源于上海移動(dòng)某運(yùn)營商的直播數(shù)據(jù)統(tǒng)計(jì)和回源情況,參見圖2~圖4。可以看出直播加速效果較好,吐出流量減去回源流量等于本系統(tǒng)服務(wù)的流量,且吐出流量是回源流量的兩倍以上,高峰期可達(dá)到更高,如節(jié)假日、晚上21時(shí)至23時(shí)。從實(shí)驗(yàn)測(cè)試數(shù)據(jù)看,ATS緩存服務(wù)達(dá)到了預(yù)期的設(shè)計(jì)要求。
系統(tǒng)在上海移動(dòng)網(wǎng)進(jìn)行了測(cè)試,數(shù)據(jù)分析表明,網(wǎng)絡(luò)直播緩存加速達(dá)到預(yù)期效果,解決了直播的延時(shí)和卡頓問題,同時(shí)也減少了網(wǎng)絡(luò)的負(fù)載。系統(tǒng)還需進(jìn)一步的研究,主要包括:1)網(wǎng)絡(luò)數(shù)據(jù)塊的數(shù)據(jù)傳輸,實(shí)現(xiàn)*.ts和*.data等數(shù)據(jù)類型的直播;2)開發(fā)大文件的緩存、加速和反向代理服務(wù)等功能;3)熱點(diǎn)功能,當(dāng)用戶過多時(shí),如果服務(wù)器將每個(gè)用戶的請(qǐng)求都進(jìn)行緩存,服務(wù)器資源消耗相當(dāng)大,可以研究熱點(diǎn)功能的開設(shè),將訪問數(shù)量較多的資源進(jìn)行緩存。
[]
[1]王彥輝,張德全.兩類重要網(wǎng)絡(luò)的傳輸延遲分析[J].計(jì)算機(jī)工程與應(yīng)用,2010,46(18):87-88.
[2]李銳,唐旭,石小龍,等.網(wǎng)絡(luò)GIS中最佳負(fù)載均衡的分布式緩存副本策略[J].武漢大學(xué)學(xué)報(bào)(信息科學(xué)版),2015,40(10):1287-1293.
[3]張國強(qiáng),李揚(yáng),林濤,等,信息中心網(wǎng)絡(luò)中的內(nèi)置緩存技術(shù)研究[J].軟件學(xué)報(bào),2014,25(1):154-175.
[4]蔡君,余順爭(zhēng),劉外喜.基于節(jié)點(diǎn)社團(tuán)重要度的ICN緩存策略[J].通信學(xué)報(bào),2015,36(6):2015222.DOI:10.11959/J.issn.1000-436x.2015222.
[5]SARA ALOUF,NICAISE CHOUNGMO FOFACK,NEDKO NEDKOV.Performance models for hierarchy of caches:application to modern DNS caches[J].Performance Evaluation,2016,97:57-82.
[6]張振偉,李志雄.網(wǎng)絡(luò)視頻直播緩存系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)工程,2002,28(8):227-230.
[7]李云飛,謝偉凱,魯晨平,等.面向直播HTTP Streaming系統(tǒng)的HTTP緩存服務(wù)器行為優(yōu)化[J].計(jì)算機(jī)工程與應(yīng)用,2012,48(1):68-74.
[8]李潤(rùn)知,郭純一,范明,等.P2P流媒體直播分布式緩存替換算法研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2011,32(1):58-61.
[9]張曉軍,呂潔,張蓓.HTTP重定向在網(wǎng)關(guān)認(rèn)證中的應(yīng)用[J].大連理工大學(xué)學(xué)報(bào),2005,45(s1):48-51.
[10]羅劍鋒.Boost程序完全開發(fā)指南[M].3版.北京:電子工業(yè)出版社,2015.