Instagram Feed 是一個用於分享和聯繫對您而言重要的人和事的平台。 當您打開 Instagram 或刷新動態時,我們認為您會感興趣的照片和視頻將顯示在頂部。
新聞提要是包含由系統中其他實體創建的文本、圖像或視頻的項目集合,供您閱讀。 它總是在變化,而其他組織正在發布新的帖子。
在這篇文章中,我們將仔細研究 Instagram 的 feed 的系統設計。 那麼,讓我們開始吧。
1。 要求
功能必要性
- 用戶的新聞提要是根據用戶關注或感興趣的系統中其他實體的帖子創建的。
- 文字、圖片和視頻都可以在帖子中找到。
- 用戶的新聞提要應使用其他人創建的新帖子進行更新。
非功能性標準
- 新聞提要的創建應實時進行。 最終用戶應該只經歷 12 秒的延遲。
- 添加新帖子:新帖子在提交到系統後出現在新聞提要請求中的時間不應超過 5 秒。
2. 容量估算
- 截至2021年7.8月,世界人口只有21億。 它表明全球 32% 的人口是 Facebook DAU(每日活躍用戶),XNUMX% 是 Facebook MAU(每月活躍用戶)(每月活躍用戶)。 這是驚人的。
- 讓我們假設我們正在構建的系統有 1 億個 DAU,以使事情變得更容易。
- 假設一個人在 Facebook 上關注了 500 個人或企業。 一個組或一個頁面可能被視為一個實體。
預計流量
假設一位用戶平均每天下載新聞提要 10 次。 所以每天大約有 116K QPS 和 1e10 個請求。
存儲估計
假設我們在內存中平均維護 500 個來自每個用戶的新聞提要的帖子以便快速檢索,每個帖子的大小為 1KB。 因此,每個用戶 500 KB,所有 DAU 500 TB,以及 5000 台計算機,每台具有 100 GB RAM。
3. 系統 API
userId (GUID):正在獲取其新聞提要的用戶。
可選選項參數中提供以下字段:
- afterPostId (GUID):從該帖子之後的帖子中獲取新聞提要。 如果未指定,請獲取最新帖子。
- count(number):每個請求可以返回的最大帖子數。 如果未提供,則後端設置默認的最大數量。
- excludeReplies(布爾值):防止回复包含在新聞提要中。
- 返回的 JSON 包含新聞提要項目的列表。
4. 設計數據庫
實體
- 用戶名单
- entityId、名稱、描述和時間戳都是必填字段。
- 以下字段是必需的:PostId、標題、文本、authorId 和時間戳。
- 時間戳、url 和 mediaId
關係
- 用戶可以關注其他用戶或實體。 (m:n)
- Author-Post:用戶和實體都可以創建帖子。 為簡單起見,假設只有用戶可以創建帖子。 (1:n;authorId 是可嵌入的)。
- 每個帖子都伴隨著某種形式的媒體。 (1:n)
5. 高級設計
架構
工作流程
飼料生產
當 Jay 請求她的新聞流時,系統將執行以下操作:
- 檢索 Jay 關注的所有人和事物的 ID。
- 聚合帖子:給定這些 ID,獲取最新、熱門和相關的帖子。
- 根據帖子的相關性和時間對帖子進行排名。
- 緩存:保存創建的提要並將前 20 個帖子發送給 Jay。
- 當 Jay 讀完前 20 個帖子時,會發送另一個請求以獲取接下來的 20 個帖子。
飼料分配
假設 Jay 正在關注 Aayush,並且 Aayush 發布了任何新內容。 Jay 的新聞提要需要由系統更新:
- 檢索 Aayush 的追隨者的 ID。
- 添加新文章:將 Aayush 的帖子添加到這些 ID 的關注者的新聞源池中。
- 根據帖子的相關性和時間對帖子進行排名。
- 更新排名帖子的緩存。
- 發布新帖子時應通知關注者。
組件
用戶的連接由 Web 服務器維護。
上述過程由應用服務器執行。
緩存和數據庫:
- 關係數據庫用戶/實體
- 關係數據庫(帖子)
- 圖片/視頻屬性:Aayush storge
- 關係數據庫元數據
個性化服務:
- 飼料生產
- 提要通知
6. 詳細設計
飼料的產生
扇出讀取幼稚實現:
這種草率實施的問題包括:
- 擁有大量朋友/追隨者的用戶會注意到顯著放緩,因為我們必須篩選、合併和排名大量帖子。
- 當用戶加載他們的頁面時,我們構建了時間線。 這可能很緩慢並且有很多延遲。
- 每次狀態更新都會導致所有關注者的動態更新以進行實時更新。 這可能會導致我們的新聞源生成服務出現嚴重延遲。
我們可以預先生成年表並將其保存在內存中以提高效率。
離線生產(扇出寫入)
我們可以有專門的服務器,不斷地在內存中創建和存儲用戶的新聞源。 我們可以在用戶需要時從預先生成的保存位置提供新聞提要。
用戶的提要應存儲在內存中多少個提要項?
根據您的使用行為進行調整。
我們應該為所有用戶製作一個新聞源(並將其保存在內存中)嗎?
- 對於不經常登錄的人。
- 基於 LRU 的緩存是一種簡單的方法。
- 更好的解決方案是弄清楚用戶如何登錄。什麼時候登錄? 你說的是哪個工作日?
飼料發布
扇出是向所有關注者發送帖子的過程。
扇出讀取(拉)
當您請求新聞提要時,系統會收到閱讀請求。 扇出閱讀向您的所有關注者發送閱讀請求,要求他們閱讀他們的內容。
優點:
- 寫作的過程很便宜。
- 讀取數據時,使用各種聚合算法更容易。
缺點:
- 對於一個有很多粉絲的人來說,讀操作是相當昂貴的。
- 用戶在提取數據之前不會看到新數據。
- 當我們定期拉取最新的帖子時,很難找到合適的拉取節奏,並且大多數拉取請求會返回一個空答案,浪費資源。
扇出寫入(推)
當您發送新帖子時,系統會向系統發出寫入請求。 寫入請求將發送給您的所有關注者,以使用扇出寫入更新他們的新聞源。
專業版
- 讀取過程成本低廉。
同
- 對於擁有數百萬粉絲的用戶來說, 寫 手續太貴。
Feed的排名
今天的排名算法不僅僅按時間順序對提要進行排序,還試圖保證具有更大相關性的項目被優先考慮。
- 選擇可以幫助您確定摘要項目相關性的因素,例如喜歡、評論和分享的數量,如果文章包含照片或視頻,則項目最後更新的時間等等。
- 根據特徵計算分數。
- 使用分數對帖子進行排名。
設置用戶留存、廣告收入等 KPI,看看我們的排名系統有多有效。
結論
儘管 Instagram 或其母公司 Facebook 是一家大公司,但它對 系統設計。
我盡我最大的努力為您提供 Instagram 提要的高級摘要。
我希望它是有幫助的,你會好好利用它。
發表評論