作者丨Todd Hoff
譯者丨Sammy Liu @ 世民談雲計算
Netflix 看起來再也簡單不過了。你在Netflix App或網站中看到喜歡的視頻后,點擊播放按鈕,立刻視頻就魔術般地出現在眼前。真的很簡單,不是嗎?其實不然。
也許你會認為Netflix完全利用AWS來提供視頻服務。在Netflix應用中點擊播放按鈕后,存放在AWS S3中的視頻文件會被以視頻流形式通過因特網傳送到你的設備上。乍看起來,這似乎是一個非常合理的方法,就像很多小型應用一樣。但這不是Netflix的實現方式。它比這個方案復雜得多,也有趣得多,遠超你的現象。
2017年的Netflix
我們先來看看Netflix在2017年的一組統計數據:
-
擁有超過1.1億的訂閱用戶
-
在超過200個國家提供服務
-
每季度約30億美金營收
-
每季度新增超過5百萬用戶
-
每周播放小時數超過10億
-
平均每天播放視頻2.5億小時
-
所占用的互聯網流量超過美國因特網峰值流量的37%
-
計划在2018年在新視頻內容上花費超過70億美金
我們能從中看出些什么呢?
Netflix是個龐然大物,它是全球性企業,擁有海量用戶,播放海量視頻,掙了很多很多錢。Netflix的業務基於用戶訂閱模式。訂閱用戶每個月向Netflix付費后在Netflix中享受視頻,覺得它不爽時可以隨時取消訂閱。
Netflix是我們已經討論過的所有雲計算相關事情的集大成者,這就是為什么本章中我們會比其他章節的內容介紹得更加深入些。我們這么做的一大原因是相比其他企業Netflix做了更多的事情。比如,Netflix公司內有個大家共同遵守的企業文化准則。他們非常開放。過去幾年中,Netflix舉行了幾百場演說,寫了成百上千的文章,關於他們公司是如何運作的。整個行業都因此而受益。另一個想要深入了解Netflix的原因是純屬好奇。我們大多數人都或多或少地用過Netflix。誰不想了解下這背后的運作原理呢?
Netflix的運作依賴於兩個雲:AWS和Netflix自己的Open Connect。
Netflix是如何向其用戶提供優質服務的呢?用雲!AWS和Open Connect 兩個不同的雲無縫合作,向用戶提供源源不斷的視頻流服務。Netflix系統包括三部分:客戶端、后台和CDN。
客戶端(client)運行在用戶設備上,用於瀏覽和播放Netflix視頻。比如你iPhone手機上的App,你電腦上的網站,你的智能電視上的App。Netflix管控所有客戶端。在你點擊播放按鈕之前的一切活動都發生在AWS上,包括准備新視頻、處理所有客戶端發來的請求等。
點擊播放按鈕后的一切活動由Open Connect處理。它是Netflix定制的全球CDN服務,它在全球不同的地方保存視頻。你點擊播放按鈕后,Open Connect中的視頻以流的形式進入你的設備。不要着急,后面我們會詳細介紹它。
通過控制客戶端、后台和CDN這三個部分,Netflix完成了系統的垂直整合。Netflix端到端地控制視頻播放的全流程。因此,不管你在哪里,在任何時候,你都能流暢地播放任何你想看的視頻。
下面我們來看看這到底是怎么做到的。
2008年,Netflix開始向AWS遷移系統
Netflix成立於1998年。一開始,他們通過美國郵政提供DVD租用服務,隨后,他們看到了按需視頻流服務(on-demand streaming video)的未來。2007年Netflix開始提供視頻流服務,允許訂閱用戶點播視頻,在個人電腦的網站上、智能手機上、游戲機,和智能電視上。
我個人認為,按需視頻流的未來是顯而易見的,后來發生的一切也證明了這一點。我工作過的一些創業公司也嘗試過此類業務,但他們都失敗了。
然而,Netflix成功了。雖然他們進入此行業算晚的了,但這也幫助了他們。2007年,因特網速度足夠快了,也夠便宜了,因此能很好地支撐這種業務。而在此之前,情況卻不是這樣。快速的低成本的移動帶寬、處理能力強大的設備比如智能手機和平板,使得這一些變得更加容易也更便宜。天時很重要!
一開始,Netflix自己運營數據中心
直到2007年AWS才發布EC2服務,而這一年Netflix也開始提供視頻流服務。因此,這時候他們還沒法牽手合作。此時,Netflix自己運營兩個挨得很近的數據中心。他們遇到了我們在前面章節中提到的幾乎所有問題。自己運營數據中心需要投入大量精力,設備采購、安裝和上線運行都需要很長時間。每當前一批剛剛上線完成,容量就不夠了,一切就得從頭來過。
這使得Netflix不得不采用“垂直擴容“策略,也就是在大型電腦上運行被稱為”單體“的能處理所有業務的大型系統。問題是,對於Netflix這種體量的公司,很難將這種單體應用弄的非常可靠,實際上他們確實沒做到。
一次服務宕機促使Netfix將系統遷移到AWS上
2008年8月間,整整三天,因為數據庫宕機,Netflix無法寄送DVD。這是不可接受的。Netflix到了需要改變的時候了。自己運營數據中心的經歷讓他們懂得了他們並不擅長於此。Netflix所擅長的是向用戶提供視頻服務,這也是他們未來所在。運營數據中心並不是Netflix的優勢技能,只有提供視頻服務才是。
這時候,Netflix決定把系統遷移到AWS上。但AWS剛剛建立,因此這個決定是個巨大的冒險。Netflix之所以想遷移到AWS上,是為了獲得一個更加可靠的基礎設施。他們想從系統中移除所有故障單點。AWS提供高可靠的數據庫、存儲和數據中心。Netflix想利用雲計算,而不是構建不可靠的大型單體應用。他們想在不自己運作數據中心的前提下向全球用戶提供服務。這些通過他們自己的數據中心是不可能做到的。
他們選擇AWS的另一個原因是他們想從非核心業務上脫身。非核心業務是他們不得不做,但對核心視頻服務提供不了任何幫助的事情。AWS把這一切都承擔了,這讓Netflix能聚焦到核心業務上。
Netflix花了整整八年才完成了全部遷移工作。在此期間,Netflix的流媒體客戶數量增長了八倍。 Netflix現在在數十萬個EC2實例上運行他們的系統。
AWS上的Netflix更加穩定可靠
並不是說Netflix從未經歷過AWS宕機的情況,但總的來說,它的服務比以前更加可靠。現在的Netflix之所以變得如此可靠了,是因為他們已經采取了非常規手段。Netflix系統運行在三個AWS區域(Region)中:一個在北弗吉尼亞州(North Virginia),一個在俄勒岡州波特蘭市(Portland Oregon)以及一個在愛爾蘭都柏林(Dublin Ireland)。在每個區域內,Netflix使用三個不同的可用區中。
Netflix表示他們沒有計划使用更多區域。添加新區域非常昂貴且復雜。大多數公司在一個地區開展業務,更不用說兩個或三個了。
使用三個區域的優點是任何一個區域發生故障后,其他區域將接管故障區域中的所有用戶流量。當某個區域發生故障時,Netflix將其稱為疏散區域(evacuating)。
我們來舉個例子。假設你正在英國倫敦觀看《新紙牌屋》。由於你距離倫敦最近,因此你設備上的Netflix客戶端連接到AWS都柏林區域。那如果整個都柏林區域都故障了呢?這是否意味着Netflix應該停止為你服務?當然不會!Netflix檢測到故障后,客戶端會重定向到AWS弗吉尼亞區域。你的設備現在與弗吉尼亞州地區通信,而不是與都柏林通信。你甚至可能沒有注意到發生了故障。
一個AWS區域多久發生一次故障?每月一次。嗯,一個區域實際上並不是每個月都會發生故障,只是Netflix會每月進行一次測試。每個月,他們都會故意讓某個區域出現故障,以確保其系統可以處理區域級別的故障。一個區域可以在六分鍾內被疏散。
Netflix稱這為全球服務模型(global services model)。通過這三個區域,Netflix可以服務全球任何地方的用戶。這真是個了不起了的創舉,但這一切並不是與生俱來的。AWS也無法完全避免整個區域發生故障。Netflix自己完成了處理區域故障的所有工作。Netflix是使用多個區域構建可靠系統的先驅。我不知道有沒有其他公司會竭盡所能使他們的服務變得如此可靠。
在這三個地區中的另一個優勢是,它使Netflix遍及全球。Netflix進行了一些測試,發現不論用戶在世界任何地方使用Netflix應用程序,都能從這三個地區之一獲得快速的服務。
Netflix在使用AWS后更省錢了
這可能會讓很多人感到驚訝,但是使用AWS確實比Netflix使用自己的數據中心更成本更低。每個視頻流的雲上成本最終只是其舊數據中心成本的一小部分。
為什么呢?這歸功於雲的彈性。
Netflix可以在需要時增加服務器,在不需要時將其退還。因此,Netflix不必擁有大量閑置的只是為了處理高峰負載而無所事事的計算機,而僅在需要時才支付所需的費用。
雲計算:你點擊播放按鈕前的行為都在AWS中處理
任何不涉及視頻流的請求都在AWS中處理,包括可伸縮計算、可伸縮存儲、業務邏輯、可伸縮分布式數據庫、大數據處理和分析、推薦、轉碼以及數百種其他功能。不用擔心,你不需要了解所有這些內容,但還是出於好奇,我接下來做下簡要說明。
可擴展計算和可擴展存儲
可擴展計算是EC2,可擴展存儲是S3。這沒有什么新鮮的。你的Netflix設備(iPhone,TV,Xbox,Android手機,平板電腦等)與EC2中運行的Netflix服務通信。
查看視頻列表時,你的Netflix設備與EC2中實例中的應用通信以獲取該列表。詢問有關視頻的詳細信息時,你的Netflix設備在EC2中實例中的應用以獲取詳細信息。這和本書中討論的所有其他雲服務沒有兩樣。
可擴展的分布式數據庫
Netflix將DynamoDB和Cassandra用作分布式數據庫。這些名稱對你沒有任何意義,它們只是高質量的數據庫產品。數據庫用於存儲數據。你的個人資料、帳單、你曾經看過的所有電影等等所有此類信息都存儲在數據庫中。
分布式(Distributed)。分布式意味着一個數據庫不在一台大型計算機上運行,而是分布在多台計算機上運行。數據被復制到多台計算機上,因此,如果一台或幾台保存數據的計算機發生故障,你的數據仍然是安全的。實際上,你的數據會被復制到所有三個區域。這樣,如果某個區域發生故障,那么當新區域准備開始使用它時,你的數據就會在那里。
可擴展(Scalable)。可伸縮性意味着數據庫能處理盡可能多的數據。這是分布式數據庫的一大優勢。它可以根據需要添加更多計算機以處理更多數據。
大數據處理和分析
簡單來說,大數據意味着很多很多數據。Netflix收集了大量信息。Netflix知道每個人都觀看了什么、觀看時所處的位置、查看了哪些視頻但最終沒看、每個視頻被觀看了多少次……還有更多。將所有數據匯總在一起成為處理(processing),而理解所有這些數據被稱為分析(analytics)。分析數據以回答特定問題。
Netflix的千人前面
下面是一個很好的例子,說明Netflix如何利用其數據分析功能吸引你觀看更多視頻。
在瀏覽Netflix內容時,你會注意到每個視頻都會帶一個圖片,這就是標題圖片(header image)。它旨在吸引你選擇這個視頻。標題圖像越引人注目,你觀看這個視頻的可能性就越大。而且,你觀看的視頻越多,你退訂Netflix的可能性就越小。這是《陌生事物》的不同標題圖片的示例:
當了解到每張圖片都是Netflix精心為你挑選的時候,你可能會暗暗稱奇。一開始,Netflix為每個用戶從一組候選圖中隨機選擇一張標題圖片,例如上述``陌生事物''拼貼中的圖片。Netflix在每次視頻被觀看時對所顯示的圖片進行計數。還是``陌生事物''這個例子中,假設顯示中間那張集體照時``陌生事物''被觀看了1000次,顯示其他圖片時視頻只被觀看了一次。由此可見集體照是吸引成員觀看的最佳方式,因此Netflix將永遠將其作為《陌生事物》的標題圖像。這稱為被數據驅動(data-driven)。Netflix以數據驅動型公司而聞名。在這種情況下,數據被收集起來(在這種情況下為與每張圖片關聯的視圖數量),並用於做出最佳決策。
這真是個聰明的主意,但是你能想出更好的做法嗎?有的,通過使用更多數據,通過機器學習可以做得更好。
你和我可能是完全不同的人。你會認為我們會受到相同類型的標題圖片的激勵嗎?可能不會,因為我們有不同的品味和偏好。Netflix也知道這一點。因此,Netflix現在可以個性化地顯示給你的所有圖像。Netflix會嘗試選擇與你的視頻最相關的內容。他們是如何做到的?請記住,Netflix會記錄並統計你在其網站上所做的一切行為。他們知道你最喜歡哪種電影,最喜歡哪些演員等等。
假設給你的推薦影片是《善意狩獵》。Netflix會為之選擇一個最合適的標題圖像顯示給你。通過這張圖像,Netflix先讓你對這電影產生興趣。那Netflix該向你顯示哪張圖像呢?如果你喜歡喜劇片,Netflix將為你展示以羅賓·威廉姆斯為特色的圖像。如果你更喜歡浪漫電影,則Netflix會向你顯示馬特·達蒙(Mat Damon)和米妮·德米妮(Minnie Driver)准備親吻的圖像。
因為Netflix知道你喜歡喜劇,因此,通過展示羅賓·威廉姆斯(Robin Williams),Netflix使你知道電影中可能有幽默感,從而認為此視頻非常適合。而Matt Damon和Minnie Driver的圖像傳達了完全不同的信息。如果你是喜劇迷並且看到了這張圖片,則可以跳過。這就是為什么選擇正確的標題圖像如此重要的原因。它發送強烈的個性化信號,指示電影的內容。
這是另一個例子,《低俗小說》。如果看過很多由烏瑪·瑟曼(Uma Thurman)主演的電影,那么你很可能會看到烏瑪(Uma)的標題圖片。如果看過很多由約翰·特拉沃爾塔(John Travolta)主演的電影,那么你很可能會看到約翰(John)的標題圖片。
現在你能看出來,如何通過選擇最佳個性化圖片來使你更有可能觀看這個視頻嗎?Netflix在選擇內容時會盡可能讓你產生興趣,但Netflix也不想騙你。他們不想為了讓你觀看你可能不喜歡的視頻而顯示欺騙性圖片,這沒有任何動機。一方面,Netflix不按觀看的視頻付費,同時,Netflix試圖使你的遺憾最小化。Netflix希望你對觀看的視頻感到滿意,因此他們會選擇最適合你的標題圖像。
這只是Netflix如何使用數據分析的一個小例子。 Netflix到處都采用這種策略。
推薦
Netflix有成千上萬個視頻,但通常只會向你顯示40到50個推薦視頻。Netflix如何確定推薦哪些視頻給你呢?答案是使用機器學習,這是我們剛才談到的大數據處理和分析的一部分。Netflix會查看你的數據並預測你的需求。實際上,你在Netflix屏幕上看到的所有內容都是使用機器學習而專門為你選擇的。
轉碼:將源媒體轉換為你能觀看的視頻
現在,我們來介紹Netflix處理視頻的方法。在你在某個設備上觀看某個視頻之前,Netflix必須將源視頻轉換為適合你的設備的格式。此過程稱為轉碼或編碼( transcoding or encoding)。轉碼是將視頻文件從一種格式轉換為另一種格式,以使視頻可以在不同平台和設備上觀看的過程。Netflix一次性會在AWS中使用多達300,000個CPU用於視頻轉碼,這比大多數超級計算機都大!
源媒體的來源
那誰向Netflix發送視頻源文件呢?制作室和工作室。 Netflix將此視頻稱為源媒體(source media)。源媒體文件將交給內容運營團隊進行處理。這些視頻采用高清格式,通常有幾個TB大小,這實在很大。在你觀看視頻之前,Netflix會通過嚴格的多步驟過程對其進行處理。
驗證視頻
第一件事是驗證視頻,這要花費大量時間。它查找可能由先前的轉碼或數據傳輸問題引起的數字失真、顏色變化或幀丟失。如果發現任何問題,視頻將被退回。
送入媒體管道
視頻通過驗證后,會被送入到Netflix媒體管道(media pipeline)中。一條管道包括一系列步驟,在其中數據經過一系列環節才能被使用,就像工廠中的裝配線一樣。70多種軟件負責處理每個視頻。處理單個幾TB大小的文件是不切實際的,因此,管道工作的第一步是將視頻分成許多較小的塊,然后將這些小的視頻塊放進管道,以便可以對它們進行並行編碼。並行意味着在同一時間處理多個視頻塊。
讓我們用一個例子來說明並行性。假設你有一百只需要清洗的臟狗。你一個人一個接一個地洗狗,或者租一百個狗狗清洗器並同時清洗,哪個會更快嗎?顯然,后者會更快。這就是並行處理(parallelism)。這也是Netflix在AWS EC2中使用大量服務器用於轉碼的原因。他們需要大量服務器來並行處理這些巨大的視頻文件,這也確實發揮了巨大的作用。Netflix曾經說過可以在短短30分鍾之內對一個源媒體文件編碼完成並將其推送到CDN。
對代碼塊進行編碼后,將對其進行驗證,以確保沒有引入新的問題。然后將這些塊組裝回一個文件中,並再次進行驗證。
但結果卻是一堆文件!
編碼過程會創造出很多文件。為什么呢?因為Netflix的最終目標是支持每台聯網設備。Netflix於2007年開始在Microsoft Windows上流式傳輸視頻。隨着時間的推移,添加了更多設備,比如Roku、LG、三星藍光、Apple Mac、Xbox 360、LG DTV、Sony PS3、Nintendo Wii、Apple iPad、Apple iPhone、Apple TV、Android、Kindle Fire和Comcast X1等等。
Netflix總共支持2200種設備。每個設備都具有在該類設備上觀看效果最佳的視頻格式。如果你在iPhone上觀看Netflix,則會看到一個視頻,該視頻可為你提供最佳的iPhone觀看體驗。Netflix將視頻的所有不同格式稱為其編碼配置文件(encoding profile)。
Netflix還創建針對不同網絡速度優化的文件。如果你在快速網絡上觀看,則觀看的視頻質量會比在慢速網絡上的觀看質量更高。也有用於不同音頻格式的文件。音頻被編碼為不同質量等級和不同語言。還包括字幕文件。視頻可能具有多種不同語言的字幕。
每個視頻都有很多不同的觀看選項。你看到的內容取決於你的設備、網絡質量、Netflix計划以及你的語言選擇。
那到底有多少個文件呢?
比如《王冠The Crown》這部視頻,Netflix一共為它存儲了約1200個文件!
《Stranger Things陌生人事物第二季》有更多文件。它以8K格式拍攝,共有9集。源視頻文件有很多TB數據。僅編碼一個集就會花費190,000 CPU小時。結果共有 9,570個視頻、音頻和文本文件!
(未完待續)
本文是作者Todd Hoff在《Explain the Cloud Like I'm 10》書中的一章的上半部分,2017年發表在http://highscalability.com/blog/2017/12/11/netflix-what-happens-when-you-press-play.html。
感謝您的閱讀,歡迎關注我的微信公眾號: