Table of Contents[Ferstopje][Toanje]
Instagram Feed is in platfoarm om te dielen en te ferbinen mei de minsken en dingen dy't foar jo wichtich binne. As jo Instagram iepenje of jo feed ferfarskje, sille de foto's en fideo's wêryn wy tinke dat jo ynteressearje sille nei de top sjen litte.
De nijsfeed is in samling items mei tekst, ôfbyldings of fideo's makke troch oare entiteiten yn it systeem dy't rjochte binne op jo om te lêzen. It feroaret altyd, wylst oare organisaasjes nije berjochten meitsje.
Yn dit post sille wy it systeemûntwerp fan Instagram's feed nau besjen. Dus, lit ús begjinne.
1. Bedriuwen
Funksjonele needsaak
- De nijsfeed fan de brûker wurdt makke fan berjochten fan oare entiteiten yn it systeem dat de brûker hat folge of ynteressearre is yn.
- Tekst, foto's en fideo's kinne allegear fûn wurde yn berjochten.
- De nijsfeed fan de brûker moat bywurke wurde mei nije berjochten makke troch oaren.
Non-funksjonele kritearium
- It oanmeitsjen fan nijsfeeds moat yn realtime plakfine. De ein-brûker moat mar 12 sekonden fertraging ûnderfine.
- In nije post taheakje: It moat net mear dan 5 sekonden duorje foar in nije post om te ferskinen yn in nijsfeedfersyk nei't it is yntsjinne by it systeem.
2. Skatting fan Kapasiteit
- Mei yngong fan maart 2021 is de wrâldbefolking mar 7.8 miljard minsken. It jout oan dat 21% fan 'e wrâldbefolking in Facebook DAU (Daily Active User) is en 32% is in Facebook MAU (Monthly Active User) (Monthly Active User). Dat is geweldich.
- Litte wy foarstelle dat it systeem dat wy bouwe 1 miljard DAU hat om dingen makliker te meitsjen.
- Stel dat in persoan 500 minsken of bedriuwen folget op Facebook. In groep as in side kin wurde beskôge as in entiteit.
Estimated Ferkear
Stel dat ien brûker de nijsfeed gemiddeld 10 kear deis downloadt. Dat it is elke dei sawat 116K QPS en 1e10 oanfragen.
Skattingen fan Storage
Stel dat wy gemiddeld 500 berjochten fan 'e nijsfeed fan elke brûker yn it ûnthâld hâlde foar rappe opheljen, en elke berjocht is 1KB grut. Dus 500 KB per brûker, 500 TB foar alle DAU's, en 5000 kompjûters mei elk 100 GB RAM.
3. APIs foar Systems
userId (GUID): de brûker waans nijsfeed wurdt ophelle.
De folgjende fjilden binne beskikber yn 'e opsjonele opsjesparameter:
- afterPostId (GUID): krije de nijsfeed fan 'e post nei dizze. As net oantsjutte, krije de meast resinte berjochten.
- count (oantal): it maksimum oantal berjochten dat elk fersyk kin werom. De backend stelt in standert maksimum oantal yn as gjinien wurdt levere.
- excludeReplies (boolean): foarkomt dat antwurden wurde opnommen yn 'e nijsfeed.
- De JSON weromjûn befettet in list mei nijsfeeditems.
4. Untwerp fan in databank
Entiteiten
- Brûker
- entityId, namme, beskriuwing en tiidstempel binne alle fereaske fjilden.
- De folgjende fjilden binne ferplicht: PostId, titel, tekst, authorId en tiidstempel.
- tiidstempel, url, en mediaId
relaasjes
- Oare brûkers as entiteiten kinne wurde folge troch in brûker. (m:n)
- Auteur-Post: Sawol brûkers as entiteiten kinne berjochten oanmeitsje. Stel dat allinich brûkers berjochten kinne oanmeitsje om 'e ienfâld. (1:n; authorId is ynbêde).
- Elke post wurdt begelaat troch ien of oare foarm fan media. (1:n)
5. High-Level Design
Boukunde
Workflows
Feed produksje
As Jay har nijsstream freget, sil it systeem it folgjende dwaan:
- Nim de ID's op fan alle minsken en dingen dy't Jay folget.
- Aggregate berjochten: jûn dy ID's, krije de meast resinte, populêre en relevante berjochten.
- Rangearje de berjochten neffens har relevânsje en timing.
- Cache: bewarje de oanmakke feeds en stjoer Jay de top 20 berjochten.
- As Jay klear is mei it lêzen fan de earste 20 berjochten, wurdt in oar fersyk stjoerd om de folgjende 20 berjochten te krijen.
Feed distribúsje
Stel dat Jay Aayush folget en dat Aayush wat nijs pleatst. Jay's nijsfeed sil moatte wurde bywurke troch it systeem:
- Krij de ID's fan Aayush's folgers.
- Nije artikels taheakje: Foegje de post fan Aayush ta oan it nijsfeedpool fan folgers fan dy ID's.
- Rangearje de berjochten neffens har relevânsje en timing.
- Update de cache fan 'e ranglistpost.
- Folgers moatte wurde op 'e hichte brocht as nije berjochten wurde publisearre.
komponinten
Ferbinings fan brûkers wurde ûnderhâlden troch webservers.
De hjirboppe oantsjutte prosedueres wurde útfierd troch de applikaasjetsjinner.
Cache en databank:
- Relasjonele databank brûker / entiteit
- Relaasjedatabase (post)
- Ofbylding / fideo attribút: Aayush storge
- Relasjonele databank metadata
Persoanlike tsjinsten:
- Feed produksje
- Notifikaasje fan feeds
6. Detaillearre Design
Generaasje fan feed
Fan-out lêzen naïve ymplemintaasje:
Problemen mei dizze slordige ymplemintaasje omfetsje:
- Brûkers mei in grut oantal freonen / folgers sille in signifikante fertraging fernimme, om't wy in grut oantal berjochten moatte siftje, gearfoegje en rangearje.
- As in brûker har side laadt, konstruearje wy de tiidline. Dit kin traach wêze en in protte latency hawwe.
- Elke statusupdate sil resultearje yn feedupdates foar alle folgers foar live updates. Dit kin signifikante fertragingen feroarsaakje yn ús Newsfeed Generation Service.
Wy kinne de gronology foarôf generearje en it yn it ûnthâld bewarje om effisjinsje te ferheegjen.
Offline produksje (fan-out skriuwen)
Wy kinne tawijd servers hawwe dy't konstant de nijsfeeds fan brûkers meitsje en opslaan yn it ûnthâld. Wy kinne de nijsfeed gewoan leverje fan 'e foarôf oanmakke, bewarre lokaasje as in brûker dat wol.
Hoefolle feed items moatte in brûker syn feed wurde opslein yn it ûnthâld?
Oanpasse op basis fan jo gebrûksgedrach.
Moatte wy meitsje in nijsoanfier foar alle brûkers (en bewarje it yn it ûnthâld)?
- Foar minsken dy't net sa faak oanmelde.
- LRU-basearre caching is in ienfâldige oanpak.
- In bettere oplossing is om út te finen hoe't brûkers ynlogge. Wannear is it? Hokker wurkdagen hawwe jo it oer?
Publikaasje fan feed
Fanout is it proses fan it ferstjoeren fan in post nei al jo folgers.
Fanout lêzen (pull)
As jo in nijsoanfier oanfreegje, ûntfangt it systeem in lêsfersyk. Fanout lêzen stjoert in lêsfersyk nei al jo folgers, en freget har om har ynhâld te lêzen.
Pros:
- De proseduere fan skriuwen is goedkeap.
- By it lêzen fan gegevens is it makliker om ferskate aggregaasjealgoritmen te brûken.
Cons:
- Foar in persoan mei in protte folgers is de lêsoperaasje frij djoer.
- Brûkers sille gjin nije gegevens sjen oant se it lûke.
- As wy lûke om de meast resinte berjochten op 'e reguliere basis te heljen, is it lestich om de juste pull-kadens te finen, en de measte pull-oanfragen sille in leech antwurd weromjaan, en boarnen fergrieme.
Fanout skriuwe (druk)
In skriuwfersyk wurdt makke oan it systeem as jo in nije post stjoere. It skriuwfersyk wurdt stjoerd nei al jo folgers om har nijsfeed te aktualisearjen mei fanout skriuwen.
per
- It lêsproses is goedkeap.
mei
- Foar in brûker mei miljoenen folgers, de skriuwe proseduere is te djoer.
De rang fan de Feed
Yn stee fan gewoan bestelle de feeds gronologysk, besykje de hjoeddeiske ranglist algoritmen boppedat te garandearjen dat items mei grutter relevânsje wurde prioritearre.
- Kies faktoaren dy't jo helpe kinne beslute oer de relevânsje fan in feed-item, lykas it oantal likes, opmerkings en oandielen, de tiid dat it item foar it lêst bywurke is as it artikel foto's of fideo's befettet, ensfh.
- Berekkenje de skoare basearre op de skaaimerken.
- Brûk de skoare om de berjochten te rangearjen.
Stel KPI's yn lykas brûkersbehâld, advertinsjeynkommen, ensfh. om te sjen hoe effektyf ús rangsysteem is.
Konklúzje
Nettsjinsteande it feit dat Instagram as har memmebedriuw Facebook in enoarme korporaasje is, hat it in better begryp fan systeem ûntwerp.
Ik besocht myn bêst om jo in gearfetting op heech nivo fan 'e Instagram-feed te jaan.
Ik hoopje dat it nuttich wie en dat jo it goed brûke sille.
Leave a Reply