矽谷之路19:系統設計的基本方法SNAKE原則

以設計Netflix為例闡述系統設計的基本方法

系統設計總是讓很多人望而生畏,尤其是剛畢業的學生,如果面試時考到系統設計常常會出一身冷汗。然而系統設計其實是有跡可循的,只要我們掌握好系統設計的方法論,再難的問題也可以迎刃而解。

下面我們就以設計Netflix為例來講一講系統設計的SNAKE原則(Scenario, Necessary, Application, Kilobit, Evolve)。我們看一看Netflix的基本界面,發現有用戶,搜索和各個頻道(頻道里包含很多電影)。

我們先從宏觀開始設計,考慮Netflix的應用場景(Scenario)。第一步枚舉Netflix的應用場景,比如用戶註冊登陸,播放電影和電影推薦等。第二步對應用場景進行排序,找出最重要的功能。比如Netflix最基本的需求是能夠播放電影,不能播放電影的話其它功能都是無稽之談,所以我們專註設計播放電影這個功能。我們可以將播放電影的功能進行細分,比如首先我們要獲取一個播放頻道,然後得到頻道內電影的列表,最後選擇電影進行播放。

得到了應用場景後我們就需要得到一些限制性條件(Necessary),就是一些需求和假設。這些限制性條件可以通過詢問面試官或者進行市場調研獲得。假設我們得到Netflix有5,000,000日活用戶,每個用戶平均在線時長為30分鐘,我們就可以預測出平均並發用戶:

而我們做系統設計使不能使用平均並發用戶,而要看高峰時期的並發用戶數。我們可以將平均並發用戶乘5或6倍作為高峰並發用戶,並且我們可以再乘2作為對未來用戶數的預測。

得到了高峰並發用戶數,假設我們知道每個用戶使用的流量是3mbps,那麼我們就可以推算出3個月後的高峰流量:

同理我們也可以評估內存需求,假設每個用戶佔用10kB內存,我們有5,000,000日活用戶,乘2預測三個月後的日活用戶,再乘每個用戶10KB,得到100GB內存每天。如果我們每天清空內存,則100GB的內存就可以滿足需求。我們還可以評估硬碟需求,假設有14,000部影片,由於每部影片需要存不同的版本,所以每部電影大概佔用50GB的空間,這樣我們得到總硬碟數為700TB。

有了限制條件之後我們就可以設計應用(Application)。根據應用場景我們可以將服務組合起來得到下面的架構:

下一步是就可以根據應用來設計數據存儲結構(Kilobit)。存儲用戶信息,由於需要經常修改和查找,並且要保證一致性,我們可以選用MySQL;頻道信息添加操作比較頻繁,可以使用MongoDB;而電影只需要用保存文件就可以,不需要使用資料庫。

現在我們已經得到了基本的設計,最後一步是進化(Evolve),就是對基本設計進行優化。我們有三個方向可以考慮:更好,例如如何滿足更多用戶量,如何更魯棒;更廣,例如設計更多應用場景,增加更多功能;更深,考慮更多細節。

以上就是宏觀設計的SNAKE原則,微觀設計同樣也可以使用SNAKE原則。下面我們就來為Netflix設計一個推薦模塊。

假設我們有每個用戶喜歡的電影的列表,我們發現用戶u1和用戶u2都喜歡電影m3、m5和m7,所以我們就可以簡單地定義u1和u2的相似度(Similarity)為3。通過比較兩個用戶之間的相似度我們就可以找到一個用戶的最相似用戶。

還是先考慮場景(Scenario),在微觀設計里我們要考慮的就是介面。推薦模塊的介面很簡單,定義一個推薦類Recommender,類里定義一個方法找到最相似用戶,輸入是一個用戶ID,返回這個用戶的最相似用戶ID。使用這個介面我們就可以得到一個基本架構,是由Recommender調用底層數據來處理用戶請求(Request)。

再考慮限制性條件(Necessary),假設這個推薦模塊每10分鐘重新為每個用戶推薦一次,結合之前計算出的三個月後的高峰用戶數,可以得到三個月後的高峰QPS(Query Per Second)。

我們得到計算頻率是2083次每秒,如何實現呢?就需要演算法(Algorithm)和數據(Kilobit)的支持。不用的演算法時間複雜度不用,我們需要設計出能夠滿足需求的演算法。

t假設我們需要為用戶u1推薦一個最相似用戶,我們就需要計算u1和其它用戶的相似性。首先看看最直觀的演算法,我們將兩個用戶喜歡的電影一一比較,就可以得到兩個用戶之間的Similarity。

但是這種演算法的複雜度非常高,進行了3*2+3*4=18次比較,這種演算法無法滿足需求,所以要對演算法進行進化(Evolve)。

我們可以通過建立倒排索引來減小計算複雜度,從而提升性能。即從每個用戶喜歡哪些電影轉變為每部電影被哪些用戶喜歡。我們知道用戶u1喜歡電影m1、m3和m7,我們就可以通過查詢倒排索引,找到也喜歡m1、m3和m7的用戶,這些用戶都和u1相似。這樣我們只進行3次計算就得到了其它用戶和u1的similarity,大大降低了演算法的時間複雜度。

這種演算法我們需要在基礎的架構上加上一個預備器,使用原始數據來計算倒排索引,Recommender使用原始數據和倒排索引來進行推薦。雖然使用這種演算法複雜度已經明顯降低,但是可能單機仍然無法滿足需求,所以我們就需要使用多個Recommender共同工作來滿足需求。

以上我們從宏觀微觀兩個角度使用SNAKE原則進行了Netflix的系統設計,這個原則有相當大的普適性,其它流行的系統設計比如Uber,Wechat等也都可以使用SNAKE原則。

本文整理作者:Mengying Tian, 查看完整視頻(國內):矽谷之路19—系統設計的基本方法SNAKE原則 國外:bittiger.io/classpage/S

更多精彩內容, 請掃描下面二維碼,關注微信公眾賬號「論碼農的自我修養」


推薦閱讀:

系統為什麼一定要設置超級管理員?
矽谷之路27:如何設計用戶系統(一)
矽谷之路37:如何設計TinyURL
矽谷之路58: 如何設計WhatsAPP(一)
什麼是 Design System

TAG:Netflix | 系统设计 |