Table di cuntinutu[Piattà][Mostra]
Instagram Feed hè una piattaforma per sparta è cunnetta cù e persone è e cose chì vi importanu. Quandu apre Instagram o rinfriscà u vostru feed, e fotografie è i video chì pensemu chì sarete interessatu si mostraranu versu a cima.
U feed di nutizie hè una cullizzioni di elementi chì cuntenenu testu, imaghjini o video creati da altre entità in u sistema chì sò destinati à voi per leghje. Hè sempre cambiatu, mentre chì altre urganisazioni facenu posti novi.
In questu post, guardemu attentamente u disignu di u sistema di u feed d'Instagram. Allora, cuminciamu.
1. Cundizione
Necessità funziunale
- U feed di nutizie di l'utilizatore hè creatu da i posti da altre entità in u sistema chì l'utilizatore hà seguitu o hè interessatu.
- Testu, ritratti è video ponu esse truvati in i posti.
- A nutizie di l'utilizatori deve esse aghjurnata cù novi publicazioni creati da altri.
Criterium non-funzionale
- A creazione di nutizie deve esse realizatu in tempu reale. L'utilizatore finale deve sperimentà solu 12 seconde di ritardu.
- Appensione di un novu postu: Ùn deve piglià più di 5 seconde per un novu postu per apparisce in una dumanda di nutizie dopu chì hè sottumessu à u sistema.
2. Stima di a capacità
- Da marzu 2021, a pupulazione mundiale hè solu 7.8 miliardi di persone. Indica chì 21% di a pupulazione di u mondu hè un Facebook DAU (Daily Active User) è 32% hè un Facebook MAU (Monthly Active User) (Monthly Active User). Hè stupente.
- Facemu finta chì u sistema chì custruemu hà 1 miliardi DAU per fà e cose più faciule.
- Assumite chì una persona seguita 500 persone o imprese in Facebook. Un gruppu o una pagina pò esse cunsideratu una entità.
U trafficu stimatu
Assumimu chì un utilizatore scarica u feed di nutizie 10 volte ogni ghjornu in media. Dunque hè circa 116K QPS è 1e10 richieste ogni ghjornu.
Stima di Storage
Assumimu chì mantenemu 500 posti da u feed di nutizie di ogni utilizatore in memoria in media per una ricuperazione rapida, è ogni post hè 1KB in dimensione. Allora 500 KB per utilizatore, 500 TB per tutti i DAU, è 5000 computer cù 100 GB RAM ognunu.
3. API per Sistemi
userId (GUID) : l'utilizatore chì u so feed di nutizie hè stata pigliata.
I seguenti campi sò dispunibuli in u paràmetru di l'opzioni opzionali:
- afterPostId (GUID): uttene u feed di nutizie da u post dopu à questu. Se ùn hè micca specificatu, uttene i posti più recenti.
- count (number): u numeru massimu di posti chì ogni dumanda pò vultà. U backend stabilisce un numeru massimu predeterminatu se nimu hè furnitu.
- excludeReplies (boolean): impedisce chì e risposte sò incluse in u feed di nutizie.
- U JSON restituitu cuntene una lista di elementi di nutizie.
4. Designing una basa di dati
Entità
- User
- entityId, nome, descrizzione è timestamp sò tutti i campi obbligatori.
- I seguenti campi sò richiesti: PostId, titulu, testu, authorId è timestamp.
- timestamp, url è mediaId
raporta
- Altri Utenti o Entità ponu esse seguiti da un utilizatore. (m:n)
- Author-Post: Tutti l'utilizatori è l'entità ponu creà posti. Assumimu chì solu l'Utenti ponu creà Posts per a simplicità. (1:n; authorId hè incorporabile).
- Ogni post hè accumpagnatu da una forma di media. (1:n)
5. Design High-Level
architettura
Flussi di lavoro
Pruduzzione di alimentazione
Quandu Jay dumanda u so flussu di nutizie, u sistema farà u seguente:
- Recuperate l'ID di tutte e persone è e cose chì Jay seguita.
- Posti aggregati: dati quelli ID, uttene i posti più recenti, populari è pertinenti.
- Classifica i posti secondu a so pertinenza è u timing.
- Cache: salvate i feed creati è mandate à Jay i primi 20 posti.
- Quandu Jay hà finitu di leghje i primi 20 posti, una altra dumanda hè mandata per uttene i prossimi 20 posti.
Distribuzione di l'alimentazione
Assumite chì Jay seguita Aayush è chì Aayush publica qualcosa di novu. U feed di notizie di Jay duverà esse aghjurnatu da u sistema:
- Recuperate l'ID di i seguitori di Aayush.
- Aghjunghjite novi articuli: Aghjunghjite u post di Aayush à u gruppu di nutizie di i seguitori di quelli ID.
- Classifica i posti secondu a so pertinenza è u timing.
- Aghjurnate a cache di u postu di classificazione.
- I seguitori devenu esse avvisati quandu i novi posti sò publicati.
Elvetia
I cunnessione di l'utilizatori sò mantinuti da i servitori web.
E prucedure indicate sopra sò eseguite da u servitore di l'applicazione.
Cache è basa di dati:
- Utente / entità di a basa di dati relazionale
- basa di dati relazionale (post)
- Attributu di l'imagine / video: Aayush storge
- Metadati di basa di dati relazionale
servizii persunalizati:
- Pruduzzione di alimentazione
- Notificazione di i feed
6. Disegnu detallatu
Generazione di alimentazione
Fan-out lettura implementazione naive:
I prublemi cù questa implementazione sloppy include:
- L'utilizatori cù un gran numaru d'amici / seguitori notaranu un rallentamentu significativu postu chì duvemu vaglià, unisce, è classificà un gran numaru di pubblicazioni.
- Quandu un utilizatore carica a so pagina, custruemu a cronologia. Questu pò esse lentu è avè assai latenza.
- Ogni aghjurnamentu di u statutu hà da risultatu in l'aghjurnamenti di l'alimentazione per tutti i seguitori per l'aghjurnamenti in diretta. Questu pò causà ritardi significativi in u nostru serviziu di generazione di Newsfeed.
Pudemu pre-generate a cronologia è salvà in memoria per aumentà l'efficienza.
Produzione offline (scrittura in fan-out)
Pudemu avè servitori dedicati chì creanu constantemente è almacenà e nutizie di l'utilizatori in memoria. Pudemu solu furnisce u feed di nutizie da u locu pre-generatu, salvatu ogni volta chì un utilizatore vole.
Quanti elementi di alimentazione deve esse guardatu in memoria l'alimentu di un utilizatore?
Adattate secondu u vostru cumpurtamentu di usu.
Duvemu fà un newsfeed per tutti l'utilizatori (è priservà in memoria) ?
- Per e persone chì ùn accede micca assai spessu.
- A cache basata in LRU hè un approcciu simplice.
- Una suluzione megliu hè di capisce cumu si accede à l'utilizatori. Quandu hè? Di quali ghjorni di settimana parli ?
Publicazione di l'alimentazione
Fanout hè u prucessu di mandà un post à tutti i vostri seguitori.
Fanout lettura (pull)
Quandu dumandate un feed di nutizie, u sistema riceve una dumanda di lettura. Fanout read manda una dumanda di lettura à tutti i vostri seguitori, dumandendu à leghje u so cuntenutu.
Runzinu:
- A prucedura di scrittura hè pocu prezzu.
- Quandu leghje e dati, hè più faciule d'utilizà diversi algoritmi di aggregazione.
Cons:
- Per una persona cù assai seguitori, l'operazione di lettura hè piuttostu caru.
- L'utilizatori ùn vederanu micca dati freschi finu à ch'elli tiranu.
- Quandu tiramu per piglià e publicazioni più recenti nantu à una basa regulare, hè difficiule di truvà a cadenza di pull adattata, è a maiò parte di e richieste di pull tornanu una risposta viota, perdendu risorse.
Fanout scrive (push)
Una dumanda di scrittura hè fatta à u sistema quandu mandate un novu postu. A dumanda di scrittura hè mandata à tutti i vostri seguitori per aghjurnà a so newsfeed usendu fanout write.
par
- U prucessu di lettura hè pocu prezzu.
Con
- Per un utilizatore cù milioni di seguitori, u scrivemu a prucedura hè troppu caru.
U rangu di u Feed
Invece di urdinà solu l'alimenti in modu cronologicu, l'algoritmi di classificazione di l'oghje tentanu ancu di guarantiscia chì l'articuli cun più rilevanza sò priorità.
- Sceglite fatturi chì ponu aiutà à decide a pertinenza di un articulu di feed, cum'è u numeru di piace, cumenti è sparte, u tempu chì l'articulu hè statu aghjurnatu per l'ultima volta se l'articulu cuntene foto o video, è cusì.
- Calcule u puntuatu basatu nantu à e caratteristiche.
- Aduprate a partitura per classificà i posti.
Configurate KPI cum'è a retenzione di l'utilizatori, l'ingressu di publicità, è cusì per vede quantu efficace hè u nostru sistema di classificazione.
cunchiusioni
Malgradu u fattu chì Instagram o a so attività principale Facebook hè una grande corporazione, hà una megliu comprensione cuncepimentu di u sistema.
Aghju pruvatu u mo più duru per furniscevi un riassuntu d'altu livellu di u feed Instagram.
Spergu chì hè stata utile è chì l'avete da aduprà bè.
Lascia un Audiolibro