自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

圖解系統(tǒng)設(shè)計(jì)之Instagram

開發(fā) 架構(gòu)
我們針對(duì) userID? 將用戶的時(shí)間表存儲(chǔ)在鍵值存儲(chǔ)中。在請(qǐng)求時(shí),我們從鍵值存儲(chǔ)中獲取數(shù)據(jù)并顯示給用戶。鍵是 userID,而值是時(shí)間軸內(nèi)容(指向照片和視頻的鏈接)。因?yàn)橹档拇鎯?chǔ)大小通常限制在幾兆字節(jié)內(nèi),所以當(dāng)我們接近大小限制時(shí),我們可以將時(shí)間軸數(shù)據(jù)存儲(chǔ)在 blob 中,并將指向 blob 的鏈接放在鍵的值中。

0 簡(jiǎn)介

Instagram,分享帶有字幕的照片和視頻的免費(fèi)社交應(yīng)用。帖子可使用標(biāo)簽和地理標(biāo)簽進(jìn)行組織,使其可搜索。若標(biāo)記,帖子對(duì)粉絲和公眾可見。用戶可將配置文件設(shè)置為私人以限制對(duì)粉絲的訪問。

1 需求

1.1 功能性

  • 發(fā)布照片和視頻:用戶可發(fā)布照片和視頻
  • 關(guān)注/取關(guān)用戶:用戶可關(guān)注/取關(guān)其他用戶
  • 點(diǎn)贊或點(diǎn)踩帖子:用戶可以對(duì)他們關(guān)注的帳戶的帖子進(jìn)行點(diǎn)贊或不喜歡
  • 搜索照片和視頻:用戶可根據(jù)字幕和位置搜索照片和視頻
  • 生成新聞饋送:用戶可查看新聞饋送。包含他們關(guān)注的所有用戶的照片和視頻(按時(shí)間順序)。用戶還可以在其新聞饋送中查看建議的和推廣的照片

1.2 非功能性

  • 可擴(kuò)展性:該系統(tǒng)在計(jì)算資源和存儲(chǔ)方面應(yīng)具有擴(kuò)展性,以處理數(shù)百萬用戶
  • 延遲:生成新聞饋送的延遲應(yīng)該很低
  • 可用性:系統(tǒng)應(yīng)高度可用
  • 持久性:任何上傳的內(nèi)容(照片和視頻)都不能丟
  • 一致性:可在一致性稍微妥協(xié)。若內(nèi)容(照片或視頻)需一段時(shí)間才能在遠(yuǎn)程區(qū)域的關(guān)注者信息流中顯示,也可接受
  • 可靠性:系統(tǒng)須能容忍硬件、軟件故障

2 存儲(chǔ)模式

2.1 實(shí)體

  • 用戶:存儲(chǔ)所有與用戶相關(guān)的數(shù)據(jù),如ID、姓名、電子郵件、簡(jiǎn)介、位置、帳戶創(chuàng)建日期、上次登錄時(shí)間等。
  • 關(guān)注者:存儲(chǔ)用戶關(guān)系。Instagram有個(gè)單向關(guān)系,如若用戶 A 接受用戶 B 的關(guān)注請(qǐng)求,則用戶 B 可查看用戶 A 的帖子,但反之不成立
  • 照片:存儲(chǔ)所有與照片相關(guān)的信息,如ID、位置、字幕、創(chuàng)建時(shí)間等。還需保留用戶 ID 以確定哪張照片屬于哪個(gè)用戶。用戶 ID 是來自用戶表的外鍵
  • 視頻:存儲(chǔ)所有與視頻相關(guān)的信息,如ID、位置、字幕、創(chuàng)建時(shí)間等。還需保留用戶 ID 以確定哪個(gè)視頻屬于哪個(gè)用戶。用戶 ID 來自用戶表的外鍵

2.2 Instagram的數(shù)據(jù)模型

圖片圖片

2.3 SQL or NoSQL?

我們的數(shù)據(jù)本質(zhì)是關(guān)系型,并且我們需要數(shù)據(jù)的順序(帖子應(yīng)按時(shí)間順序出現(xiàn))和即使在故障的情況下也不會(huì)丟失數(shù)據(jù)(數(shù)據(jù)持久性)。此外,我們的例子中,我們將從關(guān)系查詢中受益,如根據(jù)用戶 ID 獲取關(guān)注者或圖像。因此,基于 SQL 的數(shù)據(jù)庫滿足這些要求。

因此,選擇關(guān)系數(shù)據(jù)庫,并在該數(shù)據(jù)庫存儲(chǔ)相關(guān)數(shù)據(jù)。

3 頂層設(shè)計(jì)

圖片圖片

  • 負(fù)載均衡器:平衡來自終端用戶的請(qǐng)求負(fù)載
  • 應(yīng)用服務(wù)器:向終端用戶托管我們的服務(wù)
  • 關(guān)系數(shù)據(jù)庫:存儲(chǔ)我們的數(shù)據(jù)
  • Blob 存儲(chǔ):存儲(chǔ)用戶上傳的照片和視頻

4 詳細(xì)設(shè)計(jì)

4.1 上傳、查看和搜索照片

客戶端請(qǐng)求上傳照片,負(fù)載均衡器將請(qǐng)求傳遞給任何一個(gè)應(yīng)用服務(wù)器,后者向數(shù)據(jù)庫添加一個(gè)條目。向用戶發(fā)送已成功存儲(chǔ)照片的更新。若遇到錯(cuò)誤,也會(huì)通知用戶。

查看照片的過程與上述流程類似。客戶端請(qǐng)求查看一張照片,從數(shù)據(jù)庫中獲取與請(qǐng)求匹配的合適的照片,并顯示給用戶??蛻舳诉€可以提供關(guān)鍵字來搜索特定圖像。

讀請(qǐng)求多于寫請(qǐng)求,并將內(nèi)容上傳到系統(tǒng)中需要時(shí)間。若分離讀(上傳)寫服務(wù),效率會(huì)更高。 由許多服務(wù)器操作的多個(gè)服務(wù)處理相關(guān)請(qǐng)求。讀服 務(wù)執(zhí)行為用戶獲取所需內(nèi)容的任務(wù),而寫服務(wù)有助于將內(nèi)容上傳到系統(tǒng)。

還需緩存數(shù)據(jù)來處理數(shù)百萬次讀取。它通過使獲取過程快速來改善用戶體驗(yàn)。我們還將選擇延遲加載,這可以最大限度地減少客戶端的等待時(shí)間。它允許我們?cè)谟脩魸L動(dòng)時(shí)加載內(nèi)容,從而節(jié)省帶寬,并專注于加載用戶當(dāng)前正在查看的內(nèi)容。這改善了在 Instagram 上查看或搜索特定照片或視頻的延遲。

照片上的讀/寫操作:

圖片圖片

4.2 生成timeline

① 拉取方式

當(dāng)用戶打開他們的 Instagram 時(shí),我們發(fā)送timeline生成的請(qǐng)求:

  • 先獲取用戶關(guān)注的人列表
  • 獲取他們最近發(fā)布的照片
  • 將其存儲(chǔ)在隊(duì)列中并顯示給用戶

但這種方法響應(yīng)***較慢***,因?yàn)槊看斡脩舸蜷_ Instagram 時(shí)我們都會(huì)生成timeline

可通過離線生成timeline,大大減少用戶感知到的延遲。如在用戶打開 Instagram 前,我們定義一個(gè)服務(wù),該服務(wù)會(huì)提前為用戶獲取相關(guān)數(shù)據(jù),當(dāng)該人打開 Instagram 時(shí),它會(huì)顯示timeline。這減少了顯示timeline的延遲率。

② 推送方法

推送方法中,每個(gè)用戶都負(fù)責(zé)將他們發(fā)布的內(nèi)容推送給關(guān)注他們的人的timeline。在之前的方法中,從每個(gè)關(guān)注者那里拉取帖子,但在當(dāng)前方法中,我們將帖子推送給每個(gè)關(guān)注者。

現(xiàn)在只需獲取推送到該特定用戶的的數(shù)據(jù)來生成timeline。

基于推送的方法:

圖片圖片

混合方法 — 讓我們將我們的用戶分為兩類:

  • 基于推送的用戶:關(guān)注者數(shù)量為數(shù)百或數(shù)千的用戶。
  • 基于拉取的用戶:關(guān)注者數(shù)量為數(shù)十萬或數(shù)百萬的名人用戶。

時(shí)間軸服務(wù)從基于拉取的關(guān)注者那里拉取數(shù)據(jù)并將其添加到用戶的時(shí)間軸中?;谕扑偷挠脩魧⑺麄兊奶油扑偷剿麄冴P(guān)注者的時(shí)間軸服務(wù),以便時(shí)間軸服務(wù)可以將其添加到用戶的時(shí)間軸中。

4.3 在哪存儲(chǔ)時(shí)間軸?

我們針對(duì) userID 將用戶的時(shí)間表存儲(chǔ)在鍵值存儲(chǔ)中。在請(qǐng)求時(shí),我們從鍵值存儲(chǔ)中獲取數(shù)據(jù)并顯示給用戶。鍵是 userID,而值是時(shí)間軸內(nèi)容(指向照片和視頻的鏈接)。因?yàn)橹档拇鎯?chǔ)大小通常限制在幾兆字節(jié)內(nèi),所以當(dāng)我們接近大小限制時(shí),我們可以將時(shí)間軸數(shù)據(jù)存儲(chǔ)在 blob 中,并將指向 blob 的鏈接放在鍵的值中。

4.4 Instagram 故事

可向我們的 Instagram 添加一個(gè)名為故事的新功能。在故事功能中,用戶可以添加一張照片,該照片僅可供他人在 24 小時(shí)內(nèi)查看。我們可以通過在表中維護(hù)一個(gè)選項(xiàng)來實(shí)現(xiàn)這一點(diǎn),我們可以在其中存儲(chǔ)故事的持續(xù)時(shí)間。我們可以將其設(shè)置為 24 小時(shí),任務(wù)計(jì)劃程序刪除超過 24 小時(shí)限制的條目。

5 最終設(shè)計(jì)

Instagram 的最終設(shè)計(jì):

圖片圖片

6 評(píng)估

  • 可擴(kuò)展性:我們可以向應(yīng)用服務(wù)層添加更多服務(wù)器以使可擴(kuò)展性更好并處理來自客戶端的大量請(qǐng)求。我們還可以增加數(shù)據(jù)庫的數(shù)量以存儲(chǔ)不斷增長(zhǎng)的用戶數(shù)據(jù)。
  • 延遲:使用緩存和 CDN 已減少了獲取內(nèi)容的時(shí)間。
  • 可用性:通過使用跨全球復(fù)制的存儲(chǔ)和數(shù)據(jù)庫使系統(tǒng)可用于用戶。
  • 持久性:擁有持久化存儲(chǔ),可維護(hù)數(shù)據(jù)的備份,因此任何上傳的內(nèi)容(照片和視頻)都不會(huì)丟失。
  • 一致性:使用了 blob 存儲(chǔ)和數(shù)據(jù)庫等存儲(chǔ)來保持?jǐn)?shù)據(jù)的全局一致性。
  • 可靠性:數(shù)據(jù)庫處理復(fù)制和冗余,因此我們的系統(tǒng)保持可靠,數(shù)據(jù)不會(huì)丟失。負(fù)載平衡層會(huì)路由繞過失敗服務(wù)器的請(qǐng)求

參考:

  • 編程嚴(yán)選網(wǎng)

責(zé)任編輯:武曉燕 來源: JavaEdge
相關(guān)推薦

2023-02-22 08:12:30

KafkaSender 線程

2024-09-13 08:18:10

2020-09-29 11:01:08

漏洞

2025-01-02 09:06:43

2024-04-09 09:56:52

多層緩存架構(gòu)Instagram

2021-09-06 06:45:06

WebpackMindMasterEntry

2023-03-15 08:17:27

Kafka網(wǎng)絡(luò)通信組件

2021-01-26 05:35:24

負(fù)載均衡系統(tǒng)設(shè)計(jì)

2021-09-06 06:45:06

Webpack優(yōu)化MindMaster

2024-02-02 10:38:06

虛擬文件系統(tǒng)VFS

2023-12-26 08:16:56

Kafka緩存架構(gòu)客戶端

2014-05-19 10:08:36

IM系統(tǒng)架構(gòu)設(shè)計(jì)

2021-04-12 05:44:44

Linux文件系統(tǒng)

2012-05-11 14:10:21

Instagram技術(shù)

2020-10-09 06:52:31

設(shè)計(jì)模式軟件

2012-04-09 13:35:10

Instagram

2021-09-30 10:45:33

Linux進(jìn)程通信

2010-06-30 14:46:49

UML類圖

2021-09-05 18:29:58

Linux內(nèi)存回收

2023-08-16 12:34:16

同步備份異步備份
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)