Inhaltsverzeechnes[Verstoppen][Show]
Instagram Feed ass eng Plattform fir ze deelen an ze verbannen mat de Leit a Saachen déi Iech wichteg sinn. Wann Dir Instagram opmaacht oder Äre Feed erfrëscht, ginn d'Fotoen a Videoen, déi mir mengen datt Dir interesséiert sidd, no uewen gewisen.
Den Newsfeed ass eng Sammlung vun Elementer mat Text, Biller oder Videoen erstallt vun aneren Entitéiten am System, déi gezielt sinn fir Iech ze liesen. Et ännert sech ëmmer, während aner Organisatioune frësch Posts maachen.
An dësem Post wäerte mir genau de Systemdesign vum Instagram Feed kucken. Also, loosst eis ufänken.
1. Requirements
Funktionell Noutwennegkeet
- Dem Benotzer säin Newsfeed gëtt aus Posts vun aneren Entitéiten am System erstallt, déi de Benotzer gefollegt huet oder interesséiert ass.
- Text, Biller a Videoe kënnen all a Posts fonnt ginn.
- Dem Benotzer säin Newsfeed soll mat neie Poste vun aneren erstallt ginn aktualiséiert ginn.
Net-funktionell Critère
- D'Schafung vun Newsfeeds soll an Echtzäit stattfannen. Den Endverbraucher soll nëmmen 12 Sekonnen Verspéidung erliewen.
- En neie Post unzefänken: Et sollt net méi wéi 5 Sekonnen daueren fir en neie Post an enger Newsfeed-Ufro ze erschéngen nodeems se an de System presentéiert ginn.
2. Estimatioun vun Kapazitéit
- Zënter Mäerz 2021 ass d'Weltbevëlkerung just 7.8 Milliarde Leit. Et weist datt 21% vun der Weltbevëlkerung e Facebook DAU (Daily Active User) ass an 32% e Facebook MAU (Monthly Active User) (Monthly Active User). Dat ass erstaunlech.
- Loosst eis maachen wéi wann de System dee mir bauen 1 Milliard DAU huet fir d'Saache méi einfach ze maachen.
- Gitt un datt eng Persoun 500 Leit oder Geschäfter op Facebook verfollegt. Eng Grupp oder eng Säit kann als Entitéit ugesi ginn.
Geschätzte Verkéier
Gitt un datt ee Benotzer d'Newsfeed am Duerchschnëtt 10 Mol all Dag erofluet. Also et ass ongeféier 116K QPS an 1e10 Ufroen all Dag.
Schätzunge vun Stockage
Unzehuelen, datt mir am Duerchschnëtt 500 Posts vun all Benotzer Newsfeed an Erënnerung halen fir séier zréckzekommen, an all Post ass 1KB grouss. Also 500 KB pro Benotzer, 500 TB fir all DAUs, a 5000 Computere mat all 100 GB RAM.
3. APIen fir Systemer
userId (GUID): de Benotzer deem säin Newsfeed ofgeholl gëtt.
Déi folgend Felder sinn am optionalen Optiounsparameter verfügbar:
- afterPostId (GUID): Kritt d'Newsfeed vum Post no dësem. Wann net uginn, kritt déi lescht Posts.
- zielen (Zuel): déi maximal Unzuel vun posts datt all Ufro kann zréck. De Backend setzt eng Standardmaximal Zuel wann keng geliwwert gëtt.
- excludeReplies (boolesch): verhënnert datt Äntwerten am Newsfeed abegraff ginn.
- Den zréckginn JSON enthält eng Lëscht vun Newsfeed Elementer.
4. Entwerfen eng Datebank
Entitéiten
- Benotzersäit
- EntityId, Numm, Beschreiwung an Zäitstempel sinn all erfuerderlech Felder.
- Déi folgend Felder sinn erfuerderlech: PostId, Titel, Text, AutorId an Zäitstempel.
- Zäitstempel, URL a MediaId
Relatiounen
- Aner Benotzer oder Entitéite kënne vun engem Benotzer gefollegt ginn. (m:n)
- Auteur-Post: Béid Benotzer an Entitéite kënne Posts erstellen. Gitt un datt nëmmen d'Benotzer kënnen Posts erstellen fir d'Einfachheet. (1:n; AuthorId ass embeddable).
- All Post gëtt vun enger Form vu Medien begleet. (1:n)
5. Héich-Niveau Design
Architecture
Workflows
Feed Produktioun
Wann de Jay hiren Newsstream freet, wäert de System déi folgend maachen:
- Recuperéiert d'IDs vun all de Leit a Saachen déi de Jay verfollegt.
- Aggregat Posts: Gitt dës IDen, kritt déi lescht, populär a relevant Posts.
- Rank d'Posts no hirer Relevanz an Timing.
- Cache: späichert déi erstallt Feeds a schéckt dem Jay déi Top 20 Posts.
- Wann de Jay déi éischt 20 Posts fäerdeg gelies huet, gëtt eng aner Ufro geschéckt fir déi nächst 20 Posts ze kréien.
Feed Verdeelung
Gitt un datt de Jay den Aayush verfollegt an datt den Aayush eppes Neies postt. Dem Jay seng Newsfeed muss vum System aktualiséiert ginn:
- Recuperéiert d'IDs vun den Aayush's Follower.
- Füügt nei Artikelen derbäi: Füügt dem Aayush säi Post an den Newsfeed-Pool vun dësen IDen Unhänger.
- Rank d'Posts no hirer Relevanz an Timing.
- Update de Cache vum Ranking Post.
- Follower sollten informéiert ginn wann nei Posts publizéiert ginn.
Komponente
D'Verbindunge vun de Benotzer gi vu Webserver erhale gelooss.
D'Prozedure uewen uginn gi vum Applikatiounsserver ausgefouert.
Cache an Datebank:
- Relational Datebank Benotzer / Entitéit
- Relational Datebank (Post)
- Bild / Video Attribut: Aayush Storge
- Relational Datebank Metadaten
Personaliséiert Servicer:
- Feed Produktioun
- Notifikatioun vun Feeds
6. Détailléiert Design
Generatioun vu Fudder
Fan-out liesen naiv Ëmsetzung:
Probleemer mat dëser schlëmmer Ëmsetzung enthalen:
- D'Benotzer mat enger grousser Zuel vu Frënn / Follower wäerten e wesentleche Verloschter bemierken well mir eng grouss Zuel vu Poste musse siften, fusionéieren a rangéieren.
- Wann e Benotzer seng Säit lued, konstruéiere mir d'Timeline. Dëst kann schwaach sinn a vill latency hunn.
- All Statusupdate féiert zu Feedupdates fir all Follower fir Live Updates. Dëst kann bedeitend Verspéidungen an eisem Newsfeed Generation Service verursaachen.
Mir kënnen d'Chronologie pre-generéieren an se an der Erënnerung späicheren fir d'Effizienz ze erhéijen.
Offline Produktioun (Fan-Out Schreiwen)
Mir kënnen engagéiert Serveren hunn, déi dauernd d'Newsfeeds vun de Benotzer an der Erënnerung erstellen a späicheren. Mir kënne just den Newsfeed aus der virgeneréierter, gespäicherter Plaz liwweren wann e Benotzer et wëllt.
Wéi vill Feedartikele sollen de Feed vun engem Benotzer an der Erënnerung gespäichert ginn?
Adaptéiert op Basis vun Ärem Benotzungsverhalen.
Solle mir en Newsfeed fir all Benotzer maachen (a se an der Erënnerung behalen)?
- Fir Leit, déi sech net dacks aloggen.
- LRU-baséiert Caching ass eng einfach Approche.
- Eng besser Léisung ass erauszefannen wéi d'Benotzer sech aloggen. Wéini ass et? Wéi eng Wochendeeg schwätzt Dir?
Publikatioun vun fidderen
Fanout ass de Prozess fir e Post un all Är Follower ze schécken.
Fanout liesen (zéien)
Wann Dir eng Newsfeed ufrot, kritt de System eng Liesufro. Fanout liesen schéckt eng Liessufro un all Är Follower, a freet se hiren Inhalt ze liesen.
matbréngen:
- D'Prozedur fir ze schreiwen ass net deier.
- Wann Dir Daten liest, ass et méi einfach verschidde Aggregatiounsalgorithmen ze benotzen.
scheinbar:
- Fir eng Persoun mat vill Unhänger ass d'Liesoperatioun zimlech deier.
- D'Benotzer gesinn net frësch Donnéeën bis se se zéien.
- Wa mir zéien fir déi rezentst Posts op enger reegelméisseger Basis ze sichen, ass et schwéier déi richteg Pullkadens ze fannen, an déi meescht Pull-Ufroe ginn eng eidel Äntwert zréck, verschwenden Ressourcen.
Fanout Schreiwen (Push)
Eng Schreiffro gëtt un de System gemaach wann Dir en neie Post schéckt. D'Schreifufro gëtt un all Är Follower geschéckt fir hiren Newsfeed ze aktualiséieren mat Fanout Schreiwen.
pro
- De Liesprozess ass preiswert.
Con
- Fir e Benotzer mat Millioune Follower, de schreiwen Prozedur ass ze deier.
De Rang vun der Feed
Amplaz just d'Feeds chronologesch ze bestellen, probéieren déi haiteg Rankingalgorithmen zousätzlech ze garantéieren datt Elementer mat méi grousser Relevanz prioritär sinn.
- Wielt Faktoren, déi Iech hëllefe kënnen d'Relevanz vun engem Feedartikel ze entscheeden, wéi d'Zuel vun de Likes, Kommentaren an Aktien, d'Zäit wou d'Element lescht aktualiséiert gouf wann den Artikel Fotoen oder Videoen enthält, a sou weider.
- Berechent de Score baséiert op de Charakteristiken.
- Benotzt de Score fir d'Posts ze klasséieren.
Setzt KPIs op wéi d'Benotzerretentioun, d'Annonce Akommes, an sou weider fir ze kucken wéi effektiv eise Rankingsystem ass.
Konklusioun
Trotz der Tatsaach datt Instagram oder säin Elterendeel Facebook eng rieseg Gesellschaft ass, huet et e bessert Verständnis vun System Design.
Ech hu mäi Bescht probéiert Iech en héije Resumé vum Instagram Feed ze ginn.
Ech hoffen et war hëllefräich an datt Dir et gutt benotze wäert.
Hannerlooss eng Äntwert