視頻點播業(yè)務(wù)是近年發(fā)展勢頭最好的互聯(lián)網(wǎng)業(yè)務(wù)。本文以從技術(shù)角度解析視頻點播服務(wù)關(guān)鍵技術(shù)
視頻內(nèi)容是如何在互聯(lián)網(wǎng)進行分發(fā)的
視頻網(wǎng)站如youtube,優(yōu)酷網(wǎng),土豆網(wǎng),新浪視頻等視頻分享網(wǎng)站通多CDN技術(shù)進行視頻內(nèi)容分發(fā)。CDN翻譯成漢語就是“內(nèi)容分發(fā)網(wǎng)絡(luò)”。編輯,網(wǎng)友制作或上傳視頻到CDN網(wǎng)絡(luò),CDN網(wǎng)絡(luò)將這些視頻分發(fā)到分布于全國各地IDC機房中的點播服務(wù)上。用戶則就近訪問最近的點播服務(wù)進行視頻體驗。組成CDN網(wǎng)絡(luò)的關(guān)鍵軟件有“Squid” “Apache” 等基于HTTP協(xié)議的服務(wù)端軟件 和域名服務(wù)器軟件如 bind,域名服務(wù)器軟件負責根據(jù)用戶的ip地址將用戶的http請求引導(dǎo)到離用戶最近的IDC機房中的點播服務(wù)器。
CDN軟件分析
流行的點播服務(wù)主要基于HTTP協(xié)議,mms協(xié)議,rmtp協(xié)議,其中http協(xié)議沒有控制消息,所以此協(xié)議不支持對點播流媒體的控制操作,如進度拖動,play,pause,stop等。
squid apche,這兩種服務(wù)器支持基于http的點播服務(wù),時下最流行,大部分視頻分享網(wǎng)站都采用類似這樣的方案。squid主要功能是反向代理的功能。一般作為點播前端服務(wù)器使用。什么是反向代理---說白了就是,當用戶訪問squid服務(wù)軟件時,如果squid沒有此視頻文件,則它會根據(jù)配置文件里設(shè)置的參數(shù),到上行的數(shù)據(jù)中心去抓取文件,之后再返回給用戶進行觀看。舉例說,當西安的用戶訪問優(yōu)庫網(wǎng)時,優(yōu)酷網(wǎng)發(fā)現(xiàn)訪問來自西安的用戶,則將此訪問引導(dǎo)至優(yōu)酷網(wǎng)在西安布置的squid服務(wù)器,當squid發(fā)現(xiàn)自己沒有用戶要的視頻時,則它根據(jù)配置文件里設(shè)置的參數(shù),到北京的數(shù)據(jù)中心的服務(wù)器抓取文件到自己本地。之后再返回視頻文件給用戶。當下次再有用戶訪問相同的視頻時,本地已經(jīng)存在了,就直接返回視頻給用戶了。
media service,flash server。這兩種服務(wù)器支持控制協(xié)議,其中media service支持mms,rtsp,flash server支持rtmp。這兩種協(xié)議服務(wù)的點播業(yè)務(wù),當用戶訪問時,用戶可以拖動滾動條,和進行暫停,終止等控制操作。56網(wǎng)的視頻可以拖動進行觀看,我覺得應(yīng)該使用的是rtmp協(xié)議。新浪早期的視頻服務(wù)都是mms協(xié)議的視頻點播,也支持拖動。
點播技術(shù)方案和優(yōu)略勢
squid + apache 方案,次方案的優(yōu)勢:
軟件很成熟穩(wěn)定。
視頻分發(fā)采用拉模式。并且squid可以組群,所以分發(fā)簡單,相對高效
技術(shù)開放。由于squid,apache都是linux上流行的軟件,并且源碼開放,所以用戶可以進行二次開發(fā)
軟件成本低、linux不需要授權(quán)費,squid,apache都免費,軟件成本基本為0
劣勢:
squid是一個古董軟件,設(shè)計的目標是代理功能,那個時候還沒有視頻分享概念。所以做cdn服務(wù)有些強人所難。很多公司搭建cdn網(wǎng)絡(luò)時都針對squid進行改造和二次開發(fā)工作
squid代理的單位是文件。當視頻文件比較大時,如幾百兆大小,反向代理抓取效率低。大家都有經(jīng)驗,傳幾百兆大小的文件需要花很長時間,并且大量占用帶寬和cpu。
squid與系統(tǒng)的結(jié)合。作為服務(wù)器軟件,支持并發(fā)量是一個很重要的參數(shù),如果一臺服務(wù)器支持并發(fā)用戶量大,則可以為公司節(jié)省大量成本。影響并發(fā)量數(shù)量有以下一些因素:
帶寬:我們都知道服務(wù)器網(wǎng)卡通常是千兆網(wǎng)卡。如果視頻編碼率為400K碼流,1000M除以400K,理論跑滿網(wǎng)卡可以支持2500個連接。但實際情況一般能跑到500M,支持并發(fā)1000個連接就很不錯了。
內(nèi)存:當并發(fā)連接數(shù)量很多時,服務(wù)器使用的內(nèi)存往往出現(xiàn)瓶頸。想想,如果一個連接需要使用1M內(nèi)存進行數(shù)據(jù)傳輸,那么1000個并發(fā)1G內(nèi)存就沒了。這就是事實。所以ngix這個軟件在這方面比apache太有優(yōu)勢了。
cpu:網(wǎng)絡(luò)io在很多系統(tǒng)上消耗致命的cpu。原因是有些平臺沒有提供高效的io模型方案。網(wǎng)絡(luò)io分阻塞和非阻塞模式,異步和同步模式。
最差的方式是阻塞同步模式。但這個模式實際是最常用的。這就是bsd socket的接口,read,write,connect,bind,listen,打多數(shù)軟件為了編程方便,讓調(diào)用線程阻塞調(diào)用這些系統(tǒng)調(diào)用。當并發(fā)量大的時候,尤其是服務(wù)器軟件,這種編程方式絕對不能接受。
非阻塞同步模式:這個模式在服務(wù)器編程中最流行,系統(tǒng)調(diào)用在unix和linux是 select, poll,windows也支持select,但提供了相對性能更好的waitforobject系統(tǒng)調(diào)用。但這些調(diào)用的基礎(chǔ)都是查詢句柄狀態(tài),而且是在用戶態(tài)下,當并發(fā)量大時,這個輪詢也會耗去大量的cpu。linux2.6之前的服務(wù)器,只能采用這個方案,而且是最優(yōu)方案。但這對于網(wǎng)絡(luò)服務(wù)大并發(fā)的要求此方案不可接受。此方案有些二次開發(fā)針對write,read系統(tǒng)調(diào)用次數(shù)進行改造,替換成writev,readv這種基于iovector的調(diào)用替換,在io時減少系統(tǒng)調(diào)用的次數(shù)。但個人認為效果有限。
最高效的方案非阻塞異步模式:支持此模式的的操作系統(tǒng)有solaris ,windows,linux 2.6以上版本,freebsd
solaris 和windows在aio基礎(chǔ)上實現(xiàn),是真正的內(nèi)核態(tài)異步io。linux的epoll調(diào)用只是異步通知句柄狀態(tài)的改變,但io的讀寫還是用戶負責,所以算不上真正的異步io。freebsd的kqueue也類似。但這個方案是現(xiàn)有方案的中的最佳方案了。其中本人更看好windows的iocp,因為windows的iocp中的系統(tǒng)調(diào)用不僅是真正的異步io,而且還支持overlapped讀寫,可以說支持多線程并發(fā)讀寫同一個io句柄。windows平臺應(yīng)該是網(wǎng)絡(luò)服務(wù)最優(yōu)前途的方案。太牛了。solaris的aiowait系統(tǒng)調(diào)用不支持多線程。
cpu對io的影響好像用掉的筆墨太多,主要是這個對并發(fā)量影響巨大。
帶寬限速:我們都知道,用戶帶寬越來越大,如果我們不限制用戶下載速度,后果很嚴重。比如:如果用戶使10M帶寬,如果不限速,100個用戶就把服務(wù)器帶寬吃掉了。實際情況中,50個這樣的,就不行了。所以服務(wù)器一定要限制用戶下載速度。如果視頻的碼流是400K,最好限制用戶500K,這樣既不影響用戶流暢的觀看,又節(jié)省了服務(wù)器帶寬。這樣一臺服務(wù)器并發(fā)就可以支持更多的用戶了。
本地緩存:反向代理軟件squid的主要的優(yōu)勢就是進行本地緩存。但如果緩存被大量的用戶很少訪問的文件占用,服務(wù)器磁盤空間畢竟有限,這時候會加劇對反向代理的次數(shù)。降低代理效果,所以對緩存要進行算法調(diào)整和設(shè)計。
cdn對p2p技術(shù)的應(yīng)用。如果反向代理軟件可以組成p2p網(wǎng)絡(luò),進行網(wǎng)絡(luò)數(shù)據(jù)塊交換,存儲。這樣會極大的減少數(shù)據(jù)中心訪問次數(shù),加速數(shù)據(jù)交換效率。squid因為是基于文件的代理,如果進行交換也是基于文件的交換,當問及大小巨大時,效果很差。
-----------------------------------
視頻網(wǎng)站應(yīng)用技術(shù)架構(gòu)圖 視頻網(wǎng)站方案
https://blog.51cto.com/u_16213629/7629576