【案例】新浪微博短視頻服務(wù)的優(yōu)化實(shí)踐
概覽
我所在的團(tuán)隊(duì)主要負(fù)責(zé)新浪微博短視頻從客戶(hù)端的轉(zhuǎn)碼上傳到服務(wù)端的轉(zhuǎn)碼存儲(chǔ)的整條服務(wù)鏈路。今天主要向大家分享我們團(tuán)隊(duì)在短視頻方面有關(guān)視頻編解碼的實(shí)踐與探索。
這是一個(gè)簡(jiǎn)單的交互圖,表示典型的生產(chǎn)者、消費(fèi)者和服務(wù)方之間的關(guān)系,他們?cè)谄脚_(tái)中關(guān)心的重點(diǎn)也會(huì)有所不同。
需要強(qiáng)調(diào)的是,我們今天主要討論通過(guò)技術(shù)手段改進(jìn)優(yōu)化服務(wù)并為消費(fèi)者帶來(lái)更加完善的產(chǎn)品體驗(yàn),關(guān)于用戶(hù)內(nèi)容的部分并不在此次討論的范疇。
簡(jiǎn)單總結(jié)下平臺(tái)中每方關(guān)切的重點(diǎn):
- 生產(chǎn)者關(guān)心視頻的發(fā)布速度,也就是用戶(hù)通過(guò)微博客戶(hù)端發(fā)布一段視頻,從點(diǎn)擊發(fā)布按鈕開(kāi)始到其他人能在微博上看到此視頻所需要時(shí)間的長(zhǎng)短。
 - 消費(fèi)者關(guān)心視頻的觀看體驗(yàn),例如是否卡頓,流量消耗等。
 - 服務(wù)方關(guān)心平臺(tái)的服務(wù)質(zhì)量。
 
發(fā)布速度
發(fā)送流程與關(guān)鍵性問(wèn)題
先來(lái)看發(fā)布速度。首先向大家簡(jiǎn)單介紹一下用戶(hù)通過(guò)微博客戶(hù)端發(fā)送視頻的流程。
客戶(hù)端是一個(gè) iOS 或 Android 平臺(tái)應(yīng)用。
首先,在客戶(hù)端我們會(huì)對(duì)視頻做一次壓縮,其目的是縮小視頻體積。
接下來(lái)視頻經(jīng)過(guò)轉(zhuǎn)碼后會(huì)被作為一個(gè)整體文件單獨(dú)上傳至 Web Server, Web Server 接收后會(huì)將視頻上傳到存儲(chǔ)服務(wù),同時(shí)在服務(wù)端觸發(fā)轉(zhuǎn)碼操作。
此服務(wù)端轉(zhuǎn)碼的目的是:
- 視頻規(guī)范化,統(tǒng)一輸出格式,排查視頻錯(cuò)誤。
 - 視頻標(biāo)記處理,為視頻添加水印或標(biāo)識(shí)。
 - 自動(dòng)截圖。接下來(lái)服務(wù)端轉(zhuǎn)碼后也會(huì)把此視頻文件上傳至存儲(chǔ)服務(wù),最后提示用戶(hù)視頻發(fā)送成功。
 
我想大家可以很明顯地看出來(lái)這里有三個(gè)關(guān)鍵性問(wèn)題:
- 整個(gè)視頻發(fā)布是一個(gè)串行的過(guò)程。意味著一旦其中任何一個(gè)環(huán)節(jié)出現(xiàn)問(wèn)題都會(huì)導(dǎo)致整個(gè)操作的失敗。
 - 服務(wù)端轉(zhuǎn)碼慢。因?yàn)樵?jīng)的服務(wù)端轉(zhuǎn)碼是一次性轉(zhuǎn)碼,我們?yōu)榱藴p小視頻壓縮的體積使用了一個(gè)比較復(fù)雜的算法。
 - 長(zhǎng)視頻發(fā)布的速度非常慢。曾經(jīng)在微博上發(fā)布一段最長(zhǎng)一小時(shí)的視頻,其延時(shí)可達(dá)好幾個(gè)小時(shí)。
 
后來(lái)我們重寫(xiě)或者重構(gòu)了每條鏈路上一些關(guān)鍵節(jié)點(diǎn)的服務(wù)代碼。
關(guān)鍵技術(shù)優(yōu)化
下面我來(lái)介紹一下幾個(gè)關(guān)鍵的技術(shù)優(yōu)化點(diǎn):
(1)在客戶(hù)端,我們會(huì)將編碼與上傳合并到同一個(gè)流程里,集成了一個(gè)監(jiān)控編碼器的線程以監(jiān)測(cè)編碼器完成 Gop 數(shù)據(jù)編碼的數(shù)量。
一旦此數(shù)量累計(jì)到一定閥值后會(huì)觸發(fā)客戶(hù)端的上傳操作,客戶(hù)端將這部分?jǐn)?shù)據(jù)進(jìn)行單獨(dú)分片并上傳至 Web Server,在 Web Server 收到所有分片之后會(huì)進(jìn)行 Merge 操作,最后上傳至存儲(chǔ)服務(wù)。
(2)我們?cè)谵D(zhuǎn)碼端集成了一個(gè)調(diào)度模塊,此模塊會(huì)在發(fā)布階段為視頻做一次低復(fù)雜度的編碼以縮短視頻的發(fā)布延遲。
當(dāng)完成這次低復(fù)雜度轉(zhuǎn)碼后,調(diào)度器會(huì)進(jìn)行一次更高復(fù)雜度的轉(zhuǎn)碼,此轉(zhuǎn)碼完成之后原播放鏈接會(huì)被替換,整個(gè)操作流程對(duì)用戶(hù)而言是無(wú)感知的。
(3)對(duì)長(zhǎng)視頻采取分片并進(jìn)行轉(zhuǎn)碼。其大概過(guò)程是:首先一個(gè)輸入的視頻會(huì)被分離成音頻軌和視頻軌。
其次依據(jù)其 GOP,視頻軌會(huì)被切割成不同的分片,一個(gè)分片中可能包含多個(gè) GOP。但一個(gè) GOP 不會(huì)被分在不同的分片中,以避免最終視頻合并時(shí)出現(xiàn)丟幀而導(dǎo)致視頻觀看卡頓的問(wèn)題。
最終分片完成后,每一片會(huì)被調(diào)度器分發(fā)到不同的轉(zhuǎn)碼器同時(shí)進(jìn)行轉(zhuǎn)碼。
此時(shí)調(diào)度器會(huì)開(kāi)啟一個(gè)監(jiān)聽(tīng)線程去監(jiān)聽(tīng)此視頻所有分片的轉(zhuǎn)碼任務(wù),一旦調(diào)度器監(jiān)測(cè)到最后一個(gè)分片已經(jīng)處理完成便觸發(fā)一次 Merge 操作,就把視頻流的所有分片合并成一個(gè)視頻,最后再和音頻軌合并為一個(gè)完整的輸出視頻。
總結(jié)與結(jié)果
上述流程中我們主要做了以下三點(diǎn)優(yōu)化:
- 客戶(hù)端:將編碼與上傳合并為一個(gè)操作。
 - 服務(wù)端:分等級(jí)轉(zhuǎn)碼。在發(fā)布階段只進(jìn)行簡(jiǎn)單復(fù)雜度的快速編碼。
 - 對(duì)長(zhǎng)視頻進(jìn)行分片并行轉(zhuǎn)碼。這里的兩個(gè)關(guān)鍵點(diǎn):A:分離音視頻。B:按 GOP 分割視頻流。
 
通過(guò)上述這些優(yōu)化,我們可以提升視頻平均發(fā)布速度至原來(lái)的 3 倍,提升長(zhǎng)視頻發(fā)布速度至原來(lái)的 10 倍以上,以上就是我們?cè)谝曨l發(fā)布階段主要進(jìn)行的一些優(yōu)化。
觀看體驗(yàn)
下面我想與大家分享一些關(guān)于觀看體驗(yàn)的優(yōu)化,分享之前先為大家介紹一下產(chǎn)品形態(tài)與觀看場(chǎng)景:
(1)產(chǎn)品形態(tài)
這是目前微博上主流的兩個(gè)視頻類(lèi)產(chǎn)品,左邊是一個(gè)信息流中的視頻,其默認(rèn)播放尺寸比較小而且基本上都以橫屏呈現(xiàn);右邊是微博于 2017 年初上線的一個(gè)新服務(wù)“微博故事”,這是一個(gè)全屏播放并可添加 AR 特效的視頻產(chǎn)品,以上是微博視頻業(yè)務(wù)的兩種產(chǎn)品形態(tài)。
(2)觀看場(chǎng)景
觀看場(chǎng)景是指用戶(hù)會(huì)在什么樣的場(chǎng)景下觀看微博視頻。首先,在網(wǎng)絡(luò)環(huán)境上可能是 Wi-Fi 或移動(dòng)網(wǎng)絡(luò);在終端設(shè)備上可能是手機(jī)、Pad 或 PC;手機(jī)又可依據(jù)不同的操作系統(tǒng)、屏幕大小、硬件配置等等進(jìn)行細(xì)分。
如果我們只做一些發(fā)布階段的工作,用戶(hù)在不同場(chǎng)景下選擇不同產(chǎn)品形態(tài)看到的都是同一份文件。這種方案可能在某些特定的場(chǎng)景下能夠帶來(lái)比較好的體驗(yàn),但是我相信對(duì)于大多數(shù)場(chǎng)景這種方案的體驗(yàn)應(yīng)該都不是最好的,甚至很糟糕。
服務(wù)端轉(zhuǎn)碼細(xì)化
第一項(xiàng)優(yōu)化是在服務(wù)端進(jìn)行轉(zhuǎn)碼的細(xì)化,簡(jiǎn)單地說(shuō)就是從原來(lái)的一個(gè)輸出變?yōu)槎鄠€(gè)輸出,這些輸出之間主要的差別大概是以下三個(gè)維度:
- 分辨率從低到高。微博視頻服務(wù)的分辨率最低是 240P,最高目前是 720P,在未來(lái)還可以更高一些。
 - 編碼復(fù)雜度從簡(jiǎn)單編碼到復(fù)雜編碼。
 - 視頻格式,例如 MP4、HLS 等等。
 
下發(fā)策略?xún)?yōu)化
我們會(huì)在客戶(hù)端構(gòu)建一個(gè)定制化的下發(fā)策略,根據(jù)產(chǎn)品形態(tài)與用戶(hù)的網(wǎng)絡(luò)環(huán)境、設(shè)備類(lèi)型、屏幕的尺寸等硬件配置來(lái)選擇一個(gè)符合此場(chǎng)景需求的編碼復(fù)雜度、分辨率、格式等輸出參數(shù)。
通常情況下,我們選擇的輸出都是此用戶(hù)在此場(chǎng)景下能夠以足夠清晰度播放的較低碼率視頻。
A/B Test
接下來(lái)要講的是一種常見(jiàn)方法叫做 A/B Test,大概分為四個(gè)步驟:定義指標(biāo)、選擇對(duì)照組、變更設(shè)置、對(duì)比結(jié)果。
定義指標(biāo)
詳細(xì)說(shuō)一下定義指標(biāo)。第一個(gè)是首幀播放延遲,簡(jiǎn)單說(shuō)就是從用戶(hù)點(diǎn)擊播放按紐到視頻的第一幀畫(huà)面播放出來(lái)所需要的時(shí)間,包括下載時(shí)間、解碼時(shí)間、渲染時(shí)間等等;第二個(gè)是播放失敗率。
第三個(gè)是有效播放率,這里我們有兩個(gè)和播放數(shù)相關(guān)的統(tǒng)計(jì)指標(biāo):總播放量就是只要此視頻有一幀被成功播放就算一次,有效播放量是指此視頻連續(xù)成功播放多長(zhǎng)時(shí)間,例如三秒鐘、五秒鐘連續(xù)的播放。有效播放率就是這兩者的比值。
選擇對(duì)照組
關(guān)于選擇對(duì)照組我們大概有兩種方式:第一種是隨機(jī)選擇,就是從所有的微博用戶(hù)中隨機(jī)抽取 20% 分成兩個(gè)對(duì)照組。
第二種是按特征選擇,可以確定用戶(hù)具體的某一個(gè)特征,例如是不是大 V 用戶(hù)或粉絲數(shù)量處于何種量級(jí),甚至可以按照用戶(hù)登陸終端設(shè)備不同來(lái)進(jìn)行選擇。
變更設(shè)置
這里我們主要在兩方面進(jìn)行一些區(qū)分與調(diào)整:第一是編解碼參數(shù),以 X264 具體來(lái)說(shuō)就是 X264 的那些編解碼參數(shù);第二是下發(fā)策略,有時(shí)候盡管兩個(gè)用戶(hù)可能處于同一個(gè)場(chǎng)景,但我們依然會(huì)下發(fā)一個(gè)不同的視頻并最終看哪個(gè)視頻的數(shù)據(jù)表現(xiàn)更好。
這里其實(shí)還有一些其他的調(diào)整,例如是否啟用客戶(hù)端的軟編、硬編、或軟解、硬解等等。
對(duì)比結(jié)果
最后就是對(duì)比結(jié)果,這里主要有兩點(diǎn),第一是前文定義的核心指標(biāo)變化情況是趨于優(yōu)還是差,第二是客觀的視頻質(zhì)量對(duì)比;我們也會(huì)借助一些開(kāi)源的工具來(lái)客觀對(duì)比視頻本身的指標(biāo),例如 PSNR 或者 SSIM,這也是 A/B Test 的主要內(nèi)容。
需要說(shuō)明的是,選擇對(duì)照組、變更設(shè)置、對(duì)比結(jié)果是不斷迭代的過(guò)程,通過(guò)不斷的去調(diào)整各種設(shè)置最終達(dá)到優(yōu)化指標(biāo)的目的。
上圖是指在 Wi-Fi 環(huán)境下微博自動(dòng)播放的一種策略。既然是自動(dòng)播放就涉及到一個(gè)問(wèn)題:播放之前需要先下載視頻,那么需要下載多少比較合適呢?
Wi-Fi 環(huán)境下自動(dòng)播放
方案一:固定長(zhǎng)度下載
一開(kāi)始我們采取的是一種叫做“固定長(zhǎng)度下載”的方案。簡(jiǎn)而言之就是每個(gè)視頻都提前下載一部分固定長(zhǎng)度的數(shù)據(jù)例如 265K。
當(dāng)時(shí)此功能上線之后我們就發(fā)現(xiàn)了兩個(gè)比較明顯的問(wèn)題:
第一是視頻下載服務(wù)器占用帶寬有很大的上升。因?yàn)樽詣?dòng)播放的功能,當(dāng)天的播放量已經(jīng)上升到之前的兩倍多,其中一部分播放量最終回到視頻的下載原站;第二是有部分的視頻依然會(huì)出現(xiàn)輕微的卡頓感。
簡(jiǎn)單解釋一下這兩個(gè)問(wèn)題的原因,其實(shí)這兩個(gè)原因都和下載方式不正確有關(guān)系。
帶寬占用飆升是因?yàn)樽詣?dòng)下載導(dǎo)致用戶(hù)下載得太多,卡頓感是因?yàn)樽詣?dòng)下載下的內(nèi)容還不足以支撐流暢的播放體驗(yàn)。
關(guān)于第二點(diǎn)需要解釋的是:我們知道對(duì)于一個(gè)視頻文件,比如說(shuō) MP4,它的一些 Meta 信息或 Moov 信息是在頭部的,并且此信息的長(zhǎng)度與視頻本身的長(zhǎng)度相關(guān),也就是說(shuō)視頻越長(zhǎng)這部分的信息提取量越大,所以對(duì)于一些短視頻自動(dòng)下載 256K 可能太多,但對(duì)于長(zhǎng)視頻下載 256K 又太少。
方案二:固定時(shí)間下載
我們想到了一種固定時(shí)間下載的方案,簡(jiǎn)而言之就是對(duì)每個(gè)視頻都先計(jì)算好一部分例如前三秒鐘的數(shù)據(jù)大小,我們?cè)诜?wù)端轉(zhuǎn)碼的同時(shí)會(huì)計(jì)算出此視頻包含的 Meta 信息、Moov 信息、前三幀的 MBAT 等加起來(lái)有多大。
在用戶(hù)瀏覽信息流的同時(shí)和這些信息將與播放鏈接一起下發(fā)至客戶(hù)端。需要進(jìn)行解釋的是這個(gè)三秒是基于我們反復(fù)調(diào)整測(cè)試最終得出的一個(gè)最佳值,可以在明顯消除自動(dòng)播放卡頓感的同時(shí)控制帶寬的占用。
提高視頻源的質(zhì)量
之前微博對(duì)發(fā)布視頻的壓縮門(mén)檻有了一個(gè)質(zhì)的提升,從 480P 提高到了 720P,并且對(duì)全部的微博用戶(hù)都開(kāi)放了此權(quán)限。我們未來(lái)還可能實(shí)現(xiàn) 1080P 的上傳,可以看到隨著分辨率的提升對(duì)比左右兩個(gè)視頻畫(huà)面差距十分明顯。
總結(jié)
簡(jiǎn)單總結(jié)一下對(duì)于觀看體驗(yàn)方面的幾項(xiàng)重要優(yōu)化:
第一是我們依據(jù)定制化的下發(fā)策略根據(jù)用戶(hù)場(chǎng)景自動(dòng)下發(fā)最符合此場(chǎng)景的視頻;第二是我們使用 A/B Test 來(lái)幫助不斷完善幾項(xiàng)核心指標(biāo),從而優(yōu)化觀看體驗(yàn);第三是我們實(shí)現(xiàn)了 Wi-Fi 下的自動(dòng)播放;第四是提升上傳視頻的質(zhì)量。
服務(wù)質(zhì)量
作為服務(wù)提供方的我們比較關(guān)心的問(wèn)題可以概括成一句話(huà):怎么既穩(wěn)定又省錢(qián)地提供高質(zhì)量的短視頻服務(wù)?
這句話(huà)有兩個(gè)關(guān)鍵點(diǎn):穩(wěn)定、省錢(qián)。為了保證穩(wěn)定我們做得更多的其實(shí)是一些類(lèi)似于多機(jī)房部署等架構(gòu)方面的工作,在此不再贅述。
降低成本
省錢(qián),是指成本優(yōu)化方面。在這里主要有兩個(gè)降低成本的思路:
思路一:保持畫(huà)質(zhì),提高編碼復(fù)雜度,降低碼率。
思路一可以簡(jiǎn)單理解為一個(gè)用時(shí)間換空間的方案。我們知道隨著編解碼器的發(fā)展,在其編碼的復(fù)雜度越來(lái)越高的同時(shí)帶寬與碼率是越來(lái)越低,同等碼率下視頻質(zhì)量越來(lái)越高。
以 H.265 為例,官方給出的比較有代表性的數(shù)據(jù)是 H.265,相對(duì)于 H.264 而言其編碼復(fù)雜度大概提升至后者的 10 倍,而碼率能夠達(dá)到 H.264 的 50%。
如此高的一個(gè)編碼成本提升,如果是在客戶(hù)端或是服務(wù)端進(jìn)行都是不現(xiàn)實(shí)的。于是我們構(gòu)想了一種新的思路:熱門(mén)視頻的極限轉(zhuǎn)碼。
思路一優(yōu)化:熱門(mén)視頻極限轉(zhuǎn)碼
- 業(yè)務(wù)特點(diǎn)
 
簡(jiǎn)單介紹一下,微博具有一個(gè)很明顯的熱點(diǎn)+長(zhǎng)尾的業(yè)務(wù)特點(diǎn),可能每天 TOP2000 或 TOP1000 部分的視頻會(huì)占到當(dāng)天視頻播放量的 50% 以上,而絕大部分視頻的播放量很低,只能占 10%~20%。
根據(jù)此種業(yè)務(wù)特點(diǎn),我們提出了這種只對(duì)一部分熱門(mén)視頻進(jìn)行極限轉(zhuǎn)碼的方案,從而最大程度地節(jié)省計(jì)算成本,降低帶寬消耗。
- 熱點(diǎn)判斷
 
如何判斷某個(gè)視頻是否為熱門(mén)視頻?我們主要從以下兩個(gè)方面:
第一是預(yù)判。在其發(fā)布階段,我們根據(jù)發(fā)布方的影響力預(yù)判其是否為熱門(mén)視頻,在這里我們并沒(méi)有什么非常復(fù)雜的機(jī)器學(xué)習(xí)算法,而是可以簡(jiǎn)單理解為根據(jù)用戶(hù)的粉絲數(shù)作出判斷。
第二是跟蹤??赡苡行┮曨l在發(fā)布階段并沒(méi)有被判定為一個(gè)熱門(mén)視頻,但是可能因?yàn)槟澄晃⒉┐?V 轉(zhuǎn)發(fā)了他的視頻或者因?yàn)檫@個(gè)視頻本身很有意思從而帶來(lái)播放量的爆發(fā)性增長(zhǎng)。
在這里我們會(huì)有一個(gè)程序去統(tǒng)計(jì)某個(gè)時(shí)間段 t 內(nèi)全站播放量 Top x 的一部分視頻;隨后這部分中還未進(jìn)行極限轉(zhuǎn)碼的視頻,會(huì)被調(diào)度器投放至一個(gè)工作隊(duì)列中進(jìn)行極限轉(zhuǎn)碼。
這里的一個(gè)小細(xì)節(jié)是我們的統(tǒng)計(jì)時(shí)間段 t 與統(tǒng)計(jì)視頻數(shù)量 x 都可根據(jù)機(jī)群的工作負(fù)載進(jìn)行動(dòng)態(tài)調(diào)整。
如果機(jī)群整體負(fù)載較高,我們會(huì)把這兩個(gè)數(shù)值調(diào)低以避免熱門(mén)視頻的轉(zhuǎn)碼對(duì)正常發(fā)布視頻的轉(zhuǎn)碼任務(wù)造成過(guò)多影響;如果機(jī)群整體負(fù)載較低,我們就可把這兩個(gè)數(shù)適當(dāng)調(diào)大以轉(zhuǎn)碼處理更多低碼率視頻從而降低帶寬成本。
- 方案選擇
 
關(guān)于方案選擇,在這里我只是提供一些可供選擇的思路,大概是有三種:
第一是更換編解碼器例如 H.265 或 AV1;第二是使用一些機(jī)器學(xué)習(xí)的技術(shù)進(jìn)行場(chǎng)景識(shí)別,判斷此視頻的類(lèi)型,從而優(yōu)化編碼過(guò)程。第三是使用云服務(wù),業(yè)內(nèi)的一些云服務(wù)提供商都能提供這種高復(fù)雜度轉(zhuǎn)碼能力的服務(wù)。
- 意義與影響
 
通過(guò)采用對(duì)熱門(mén)視頻進(jìn)行極限轉(zhuǎn)碼的方案,我們可以實(shí)現(xiàn) 20%~40% 的碼率下降;而在目前所有微博視頻播放量中通過(guò)這種高復(fù)雜度轉(zhuǎn)碼處理的視頻的占比可達(dá)到一半以上,與此同時(shí)日帶寬節(jié)省在一百 TB 以上。
思路二:保持畫(huà)質(zhì),保持編碼復(fù)雜程度,降低成本。
思路二是保持畫(huà)質(zhì)、保持編碼復(fù)雜度的同時(shí)降低成本。上圖是一個(gè)比較簡(jiǎn)單的視頻轉(zhuǎn)碼流程,從視頻輸入到解封裝,再到視頻的解碼與處理,經(jīng)過(guò)視頻的編碼最后封裝與合并到輸出。此流程可以說(shuō)本身已經(jīng)沒(méi)有什么優(yōu)化的余地。
思路二優(yōu)化:多輸出轉(zhuǎn)碼
但這里有一個(gè)前提就是其輸出并不是只有一個(gè)而是多個(gè)。這些輸出之間的差別可能就是分辨率或格式,其他的大部分的參數(shù)是一樣的。
所以我們可以復(fù)用解碼的一個(gè)環(huán)節(jié):可以看到上圖的后半段,在視頻流解碼完成之后視頻會(huì)被復(fù)制出多份,每份會(huì)進(jìn)行單獨(dú)的視頻轉(zhuǎn)碼,緊接著復(fù)制出的每一個(gè)流會(huì)與音頻流合并成一個(gè)單獨(dú)的輸出,最終通過(guò)此方式我們可以同時(shí)轉(zhuǎn)出多個(gè)輸出。
- 意義與影響
 
通過(guò)這種方式,我們可實(shí)現(xiàn)整體轉(zhuǎn)碼耗時(shí)節(jié)省 15% 左右。
降低集群冗余度
我們都知道現(xiàn)在很多的互聯(lián)網(wǎng)業(yè)務(wù)都會(huì)面臨一個(gè)流量明顯變化的過(guò)程,例如一天中某個(gè)時(shí)間段會(huì)出現(xiàn)流量的高峰或低谷。
如果希望集群能夠經(jīng)受住流量高峰的考驗(yàn)就需要保持一個(gè)比較高的冗余度,可能需要保持 1.5 甚至 2 倍的冗余,才能在流量高峰時(shí)段保證互聯(lián)網(wǎng)服務(wù)的穩(wěn)定進(jìn)行。
以下是關(guān)于此方面我們進(jìn)行的一些工作:
消除差異
首先,在整個(gè)短視頻服務(wù)的環(huán)節(jié)中,整條鏈路由以下四個(gè)服務(wù)構(gòu)成:上傳服務(wù)、轉(zhuǎn)碼服務(wù)、存儲(chǔ)服務(wù)、業(yè)務(wù)服務(wù)。
這些服務(wù)所需要的配置、運(yùn)行環(huán)境,甚至實(shí)現(xiàn)語(yǔ)言都是不一樣的,而每個(gè)服務(wù)都有自己的流量高峰與低谷。
這便導(dǎo)致了這樣一個(gè)問(wèn)題:如果按傳統(tǒng)方式,需要每個(gè)服務(wù)始終保持一個(gè)比較高的冗余度,那么所有服務(wù)加起來(lái)整個(gè)集群的冗余度就會(huì)顯得非常高,從而造成一些浪費(fèi)。
所以我們需要做的是抹除這些服務(wù)之間的差異。具體來(lái)說(shuō)是通過(guò)最近幾年在后端領(lǐng)域很火的 Docker 技術(shù)將包括配置代碼在內(nèi)的整個(gè)運(yùn)行環(huán)境打包成一個(gè)鏡像,可以簡(jiǎn)單理解為一個(gè)壓縮包。
我們所有的服務(wù)依賴(lài)的都是這種 Docker 服務(wù),只要在機(jī)器上安裝 Docker 軟件就可以隨時(shí)啟用所需服務(wù)。通過(guò)這種方式可以將之前處于高冗余度下的四個(gè)集群轉(zhuǎn)變?yōu)橐粋€(gè)集群,此機(jī)群只要保持一定的冗余度就可完成服務(wù)的承載。
定時(shí)擴(kuò)容
上圖是微博大致的每天流量變化趨勢(shì),最右邊那部分是晚 8 點(diǎn)到次日凌晨 0 點(diǎn)的晚高峰,可以說(shuō)幾乎每天流量都是以這種趨勢(shì)變化,晚高峰時(shí)段流量會(huì)比白天大部分時(shí)間段高出 20%~30% 的樣子。
面對(duì)這種情況我們會(huì)在高峰時(shí)段通過(guò)一些公有云服務(wù)擴(kuò)充出的一些計(jì)算資源承擔(dān)這部分高峰流量;當(dāng)高峰期結(jié)束便撤下這些公有云服務(wù)以盡可能降低服務(wù)的整體成本。
彈性擴(kuò)容
上圖是之前鹿晗發(fā)微博公開(kāi)戀情的半個(gè)小時(shí)內(nèi),微博一些核心服務(wù)的流量變化??梢钥吹綇?12 點(diǎn)的值到最高峰,不到半個(gè)小時(shí)流量基本翻了 4 倍。
這種量級(jí)的上漲是無(wú)法通過(guò)諸如降級(jí)或流量調(diào)配等人工干預(yù)手段有效應(yīng)對(duì),這便要求我們的服務(wù)器必須具備快速且大批量的彈性擴(kuò)容能力。
當(dāng)天我們也是從阿里云上緊急擴(kuò)容了超過(guò)一千臺(tái)的服務(wù)器,最終將此熱點(diǎn)事件造成的流量爆炸性增長(zhǎng)化險(xiǎn)為夷。
成本優(yōu)化總結(jié)
簡(jiǎn)單總結(jié)一下我們?cè)诔杀緝?yōu)化方面做的一些工作:
首先是對(duì)熱門(mén)視頻進(jìn)行極限轉(zhuǎn)碼,通過(guò)以最小的計(jì)算資源去獲取最大帶寬節(jié)省來(lái)降低成本。
其次是我們多輸出轉(zhuǎn)碼,整體上降低一些編碼的成本,隨著發(fā)布的視頻的質(zhì)量越來(lái)越高,多輸出轉(zhuǎn)碼降低成本所帶來(lái)的收益應(yīng)該會(huì)繼續(xù)提高。
第三是根據(jù)業(yè)務(wù)的流量變化通過(guò)一些彈性擴(kuò)容的手段來(lái)動(dòng)態(tài)調(diào)整集群的規(guī)模。



























































 
 
 






 
 
 
 