[譯]環(huán)球網(wǎng)如何使用NGINX技術(shù)成功直播了2014年國(guó)際足聯(lián)世界杯?(二)

原文:Globo.com’s Live Video Platform for FIFA World Cup ’14- Part II – DVR and Microservices

作者: Floyd Smith ? ? ? 譯者:杰微刊兼職翻譯汪建?

下文改編自環(huán)球網(wǎng)的Leandro Moreira 和Juarez Bochi兩位工程師 2015年九月份在San Francisco市舉辦的nginx會(huì)議的演講。這篇博客是兩部分的第二部分,這部分主要關(guān)注與使用nginx構(gòu)建微服務(wù)。第一部分主要講了傳輸及緩存方面的工作,可以在https://www.nginx.com/blog/globo-coms-live-video-platform-fifa-world-cup-14-part-delivery-caching/這里找到,同樣你也可以從YouTube上觀看完整的研究視頻。

內(nèi)容表

19:02 DVR

20:24 DVR的挑戰(zhàn)——故障轉(zhuǎn)移

21:06 DVR的挑戰(zhàn)——存儲(chǔ)

22:11 使用Redis作為數(shù)據(jù)存儲(chǔ)

23:20 巴西大選

24:12 從Redis到Cassandra

25:11 等候區(qū)

27:40 等候區(qū)的架構(gòu)

29:02 國(guó)際足聯(lián)2014世界杯成績(jī)

31:00 回顧和下一步

31:58 NGINX + Lua 表現(xiàn)驚人

33:17 開源軟件開發(fā)

33:55 總結(jié)和未來(lái)

34:50 問(wèn)答

19:02 DVR


Juarez:到2013年,我們對(duì)我們的基礎(chǔ)設(shè)施和我們提供的用戶體驗(yàn)感到很滿意,于是我們開始思考我們還可以為2014年世界杯做些什么其他事情。

我們決定開發(fā)的其中一個(gè)功能就是DVR,DVR代表數(shù)字視頻錄像機(jī),它可以提供暫停視頻播放、回放和重新觀看視頻的功能。

要做到基于HLS協(xié)議的DVR,我們只需使用一個(gè)更大的播放列表,正如你之前見到過(guò)的那樣,播放列表只是一個(gè)排列多個(gè)片段的文本文件。對(duì)于DVR,要將這些幾分鐘的視頻替換成一個(gè)完整的比賽視頻的片段。


重新回顧我們的解決方案,我們可以說(shuō)主要有兩大塊:采集和前端。兩者之間的接口就是存儲(chǔ),存儲(chǔ)存放的都是被我們分割后的片段,分割后的文件通過(guò)NGINX提供給用戶訪問(wèn)請(qǐng)求。

20:24 DVR的挑戰(zhàn)——故障轉(zhuǎn)移

因此存儲(chǔ)是一個(gè)問(wèn)題,因?yàn)槲覀儧](méi)有故障轉(zhuǎn)移能力,如果視頻流停止了,那么我們不得不重新開始,我們正在使用的EvoStream服務(wù)器,只會(huì)刪除播放列表并重新開始一個(gè)新的列表。

如果不提供數(shù)字視頻錄像機(jī)DVR功能的話,這個(gè)不算是一個(gè)問(wèn)題,因?yàn)榫退惆l(fā)生故障用戶也只會(huì)看到緩沖提示并且很快就會(huì)重新連接,然后視頻流又恢復(fù)正常。但是如果你丟失了舊的播放列表,那用戶就不能找回原來(lái)的播放點(diǎn),所以對(duì)于DVR,我們必須保持所有片段和播放列表的狀態(tài)。

21:06 DVR的挑戰(zhàn)——存儲(chǔ)



我們也有點(diǎn)擔(dān)心存儲(chǔ)大小問(wèn)題,因?yàn)閷?duì)于單一流來(lái)說(shuō),一場(chǎng)比賽我們會(huì)按照比特率對(duì)其進(jìn)行切分,這里會(huì)切分成6種比特率,每個(gè)比特率對(duì)應(yīng)著不同的質(zhì)量。用戶根據(jù)自己帶寬情況,可以觀看符合條件的任一個(gè)資源,大約每5秒視頻就有4.5兆字節(jié),所以對(duì)于兩小時(shí)的比賽,這將達(dá)到大約6G字節(jié)。

我們環(huán)球公司播放兩個(gè)同時(shí)進(jìn)行的比賽和其他播放的視頻流,所以我們需要大約40G字節(jié),這并不算很多,我們可以將他們?nèi)慷挤诺絉AM中,所以我們決定使用Redis作為視頻的存儲(chǔ)。

Leandro:我們剛剛替換了我們舊的架構(gòu),舊的架構(gòu)將數(shù)據(jù)保存到一個(gè)目錄下,而現(xiàn)在我們將數(shù)據(jù)塊和HLS文件保存到Redis中。

22:11 使用Redis作為數(shù)據(jù)存儲(chǔ)


Juarez:我們用Python建立了一個(gè)守護(hù)程序,它只是一個(gè)簡(jiǎn)單的腳本,它可以監(jiān)聽文件,當(dāng)文件被分割成片段后將它們移動(dòng)到Redis數(shù)據(jù)庫(kù)。然后我們使用NGINX配合Lua模塊從Redis獲取視頻流列表,動(dòng)態(tài)查看播放列表。這項(xiàng)工作緊緊花費(fèi)了我們一兩天的時(shí)間。

Leandro:使用Python感覺很好,但與此同時(shí)我們發(fā)現(xiàn)很難對(duì)其進(jìn)行擴(kuò)展,我不知道是不是因?yàn)槲覀儧](méi)有足夠的經(jīng)驗(yàn),對(duì)于我們來(lái)說(shuō),Python確實(shí)很難在將其擴(kuò)展到多核,所以監(jiān)聽文件變化并保存為HLS協(xié)議文件的守護(hù)程序給我們帶來(lái)很多痛苦。如果讓我們重新做一遍,我們可能會(huì)選擇另外一種語(yǔ)言,但在當(dāng)時(shí)這是最簡(jiǎn)單的解決方案,現(xiàn)在它仍然在工作。

Juarez:是的,這個(gè)已經(jīng)成為一個(gè)問(wèn)題,尤其是在巴西大選直播期間。

23:20 巴西大選


所以,后來(lái),當(dāng)我們?cè)谥辈グ臀鞔筮x時(shí),我們有超過(guò)30個(gè)同時(shí)播放的視頻流,每個(gè)視頻流有各自的狀態(tài)。如Leandro所說(shuō),Python腳本成為了一個(gè)瓶頸,并且在使用Redis上我們也遇到了問(wèn)題,因?yàn)槲覀儫o(wú)法把所有這些都放進(jìn)內(nèi)存,所以我們決定從Redis轉(zhuǎn)向Cassandra。

需要澄清一下,世界杯直播時(shí)我們?nèi)匀皇褂肦edis,巴西大選時(shí)發(fā)生在世界杯之后,我們認(rèn)為這個(gè)比較有趣所以在這里分享。

24:12 從Redis到Cassandra


除了解決其擴(kuò)展性問(wèn)題,我們沒(méi)有必要對(duì)守護(hù)程序做過(guò)多其他的改動(dòng)。但在前端我們必需為L(zhǎng)ua開發(fā)一個(gè)新的驅(qū)動(dòng)程序。在那時(shí)候我們沒(méi)有找到任何NGINX的Lua驅(qū)動(dòng)模塊,所以我們必須自己編寫。從那時(shí)起,越來(lái)越多人使用這個(gè)模塊,這讓人看著很高興。

25:11 等候室

我們必須做的另外一件事情是建立一個(gè)等候區(qū),我們沒(méi)有使用CDN,我們已經(jīng)和巴西的幾個(gè)互聯(lián)網(wǎng)服務(wù)提供商合作,我們有兩個(gè)數(shù)據(jù)中心。

有時(shí)用戶可能通過(guò)一個(gè)低寬帶的ISP連接我們觀看視頻,這樣會(huì)導(dǎo)致在此ISP上的所有用戶都體驗(yàn)很不好,所以我們決定創(chuàng)建一個(gè)等候區(qū),如果太多用戶從同一個(gè)連接觀看視頻,我們會(huì)將他們放進(jìn)一個(gè)隊(duì)列里。


Leandro:我們?cè)诤竺鎸⑸婕案嗟群騾^(qū)的相關(guān)細(xì)節(jié),但首先,我們要討論下我們多連接的解決方案,使得用戶能根據(jù)IP選擇走哪個(gè)線路。

選播的工作原理是這樣的:你要有一個(gè)BGP協(xié)議,該協(xié)議用于決定路線,然后我們要有ISP,由于我們是一個(gè)互聯(lián)網(wǎng)公司,我們屬于一個(gè)自治系統(tǒng),所以我們可以用公司的ISP進(jìn)行數(shù)據(jù)交換。

所以由我們決定線路,然后我們的ISP將承認(rèn)這條線路,現(xiàn)在,如果在圣保羅附近有很多用戶,當(dāng)他們?cè)噲D訪問(wèn)給定的地址是,ISP會(huì)智能的將他們的請(qǐng)求路由到最近的PoP。

現(xiàn)在我們可以更加深入地討論等待區(qū)了。


這里我們可以看到ISP Y只有非常低的帶寬連接到我們,所以連接他們的用戶在看直播時(shí)將會(huì)體驗(yàn)很差。但他們不會(huì)抱怨他們的ISP,他們會(huì)通過(guò)推特來(lái)抱怨我們,這顯然是不理想的,所以我們想出了等候區(qū)方案。

27:40 等候區(qū)的架構(gòu)


這里我們可以看到ISP Y只有非常低的帶寬連接到我們,所以連接他們的用戶在看直播時(shí)將會(huì)體驗(yàn)很差。但他們不會(huì)抱怨他們的ISP,他們會(huì)通過(guò)推特來(lái)抱怨我們,這顯然是不理想的,所以我們想出了等候區(qū)方案。

27:40 等候區(qū)的架構(gòu)


我不知道你們是否像我們一樣喜歡足球,但我們對(duì)這個(gè)結(jié)果不滿意,但這就是生活。

我非常興奮我們有很多的帶寬供我們使用,該圖大致顯示了我們對(duì)比賽進(jìn)行直播時(shí)的幾個(gè)峰值,這并不是所有比賽的情況,但我對(duì)這個(gè)結(jié)果非常滿意。


我們有超過(guò)50萬(wàn)用戶同時(shí)在線,并且我們可以很容易地支持更多的用戶。我們本來(lái)預(yù)計(jì)有100萬(wàn)用戶同時(shí)在線觀看,但我們懷疑真實(shí)的在線用戶可能比預(yù)期的要少,因?yàn)楫?dāng)巴西進(jìn)行比賽時(shí),人們可以從家里觀看比賽,所以,很多人們更愿意通過(guò)電視觀看,于是通過(guò)環(huán)球網(wǎng)觀看的用戶會(huì)少很多。

另一個(gè)很酷的數(shù)字是某場(chǎng)比賽達(dá)到640Gbps,我認(rèn)真這是相當(dāng)不錯(cuò)的。


既然我們有索倫儀表盤,我們可以通過(guò)監(jiān)控軟件Graphite進(jìn)行估算,結(jié)果是所有觀眾觀看的時(shí)間總和大致超過(guò)1600年,我們有超過(guò)四千萬(wàn)用戶觀看。


這里你可以看到我們的平均比特率,這里面也有我高興的事情,就是我們每個(gè)節(jié)點(diǎn)使用了僅僅10%CPU就能達(dá)到20G每秒速度。

31:00 回顧和下一步

既然我們已經(jīng)展示了我們的成績(jī),我覺得是時(shí)候回顧一下,并且討論下我們下一步可以為我們的平臺(tái)做什么事。


Juarez:我們?cè)谝曨l流方面使用了很多NGINX,我們用它來(lái)做傳輸、用來(lái)做緩存。我們開發(fā)了地理定位、授權(quán)、認(rèn)證等多個(gè)模塊。

我們也圍繞它內(nèi)置了很多微服務(wù),我們使用NGINX和Lua用于播放列表的生成,也用于等候區(qū)。我們還有另外一個(gè)前面沒(méi)有時(shí)間提及的系統(tǒng),這個(gè)系統(tǒng)可以鎖定一個(gè)用戶可以擁有并發(fā)會(huì)話的數(shù)量,但這主要用于封閉播放,而不是用于像世界杯這樣的直播。

31:58 NGINX + Lua 表現(xiàn)驚人


我們真的很喜歡NGINX和Lua,我們也很高興嘗試了nginScript,但到目前為止,我們更喜歡Lua,它也是在巴西被創(chuàng)造出來(lái)的。

Leandro:這個(gè)與目前的問(wèn)題不相關(guān)。

Juarez:哈哈,是的,這個(gè)與目前的問(wèn)題不相關(guān)。我認(rèn)為我們應(yīng)該看看技術(shù)方面的東西,我們一直在嘗試并且非常喜愛的框架是Busted,它在測(cè)試驅(qū)動(dòng)開發(fā)方面表現(xiàn)良好,使我們的生活更輕松。

Lua是一個(gè)小語(yǔ)言,所以很容易學(xué)習(xí),與C語(yǔ)言比起來(lái),我們?cè)陂_發(fā)UGINX+Lua時(shí)體驗(yàn)更加好,使用Lua語(yǔ)言開發(fā)起來(lái)更快,然而你仍然可以獲取接近C語(yǔ)言的性能,所以我們對(duì)此十分滿意。

Leandro:Lua至少對(duì)我們來(lái)說(shuō)更加容易,因?yàn)槲覀儾皇荂語(yǔ)言專家。

33:17 開源軟件開發(fā)


我們真的很喜歡NGINX和Lua,我們也很高興嘗試了nginScript,但到目前為止,我們更喜歡Lua,它也是在巴西被創(chuàng)造出來(lái)的。

Leandro:這個(gè)與目前的問(wèn)題不相關(guān)。

Juarez:哈哈,是的,這個(gè)與目前的問(wèn)題不相關(guān)。我認(rèn)為我們應(yīng)該看看技術(shù)方面的東西,我們一直在嘗試并且非常喜愛的框架是Busted,它在測(cè)試驅(qū)動(dòng)開發(fā)方面表現(xiàn)良好,使我們的生活更輕松。

Lua是一個(gè)小語(yǔ)言,所以很容易學(xué)習(xí),與C語(yǔ)言比起來(lái),我們?cè)陂_發(fā)UGINX+Lua時(shí)體驗(yàn)更加好,使用Lua語(yǔ)言開發(fā)起來(lái)更快,然而你仍然可以獲取接近C語(yǔ)言的性能,所以我們對(duì)此十分滿意。

Leandro:Lua至少對(duì)我們來(lái)說(shuō)更加容易,因?yàn)槲覀儾皇荂語(yǔ)言專家。

33:17 開源軟件開發(fā)


Leandro:綜上所述,從2010年到2014年,我們從RTMP協(xié)議轉(zhuǎn)移到HLS協(xié)議,然后我們推出這個(gè)叫DVR的功能。

現(xiàn)在,我們期待奧林匹克運(yùn)動(dòng)會(huì)的到來(lái),我們正考慮提供不同類型的方式,例如Dynamic Adaptive Streaming over HTTP。我們可能會(huì)改變采集方面關(guān)于信號(hào)被攝入的方式,也許要讓它支持4K。

Juarez:有一件事我們肯定知道的是,我們將繼續(xù)使用NGINX。

Leandro:是的。

34:50 問(wèn)答

1、有多少用戶在看巴西隊(duì)和德國(guó)隊(duì)的比賽?詳細(xì)情況你知道嗎?

Juarez:我覺得在第三個(gè)進(jìn)球之后,沒(méi)有一個(gè)觀眾(笑)。不,只是開個(gè)玩笑。觀看巴西隊(duì)比賽的觀眾很少,因?yàn)閹缀跛腥硕际褂秒娨曉诳幢荣?,而不是通過(guò)互聯(lián)網(wǎng),大約有10萬(wàn)左右的用戶使用播放器觀看。

2、關(guān)于前端NGINX服務(wù)器,使用了NGINX Plus機(jī)器還是NGINX開源機(jī)器。

Leandro:使用了開源機(jī)器,我們使用了社區(qū)中的一款。

Juarez:是的,我們使用了默認(rèn)的NGINX開源解決方案,我們也有我們的一些硬件負(fù)載均衡器,我們使用它們對(duì)跨NGINX多個(gè)實(shí)例的拆分負(fù)載。

3、你在討論的irqbalance和CPU親和力,你是怎么意識(shí)到這是一個(gè)問(wèn)題的呢?

Juarez:我們注意到的第一件事是我們一直在丟失數(shù)據(jù)包,而且我們注意到的第二件事是機(jī)器只有一個(gè)CPU核在工作,我們發(fā)現(xiàn)使用最多CPU的進(jìn)程是處理網(wǎng)卡軟中斷的那個(gè)進(jìn)程,所以我們首先安裝irqbalance將負(fù)載分到其他CPU核上,我們發(fā)現(xiàn)將中斷指定到某個(gè)CPU核上性能會(huì)更好。

Leandro:所有這一切要?dú)w結(jié)到這一事實(shí),那就是我們看到每個(gè)節(jié)點(diǎn)的極限是擁有20Gbps傳輸能力,但我們并沒(méi)有達(dá)到20Gbps,所以我們就認(rèn)為可能是NGINX存在問(wèn)題,或者是其他問(wèn)題導(dǎo)致的,因?yàn)樗鼉H僅用于處理靜態(tài)文件,這個(gè)不應(yīng)該這么難,所以我們開始研究、故障排除,然后我們就能夠理解和運(yùn)用剛才前面講到的優(yōu)化方案。

Juarez:另外一個(gè)有趣的數(shù)字是,僅僅使用2臺(tái)NGINX服務(wù)器,我們就可以處理10萬(wàn)用戶的訪問(wèn),這個(gè)等同于我們使用50臺(tái)Flash媒體服務(wù)器處理的用戶量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容