Innehållsförteckning[Dölj][Visa]
Instagram Feed är en plattform för att dela och få kontakt med människor och saker som betyder något för dig. När du öppnar Instagram eller uppdaterar ditt flöde kommer de fotografier och videor som vi tror att du kommer att vara intresserade av att visas högst upp.
Nyhetsflödet är en samling artiklar som innehåller text, bilder eller videor som skapats av andra enheter i systemet och som är inriktade för dig att läsa. Det förändras hela tiden, medan andra organisationer gör nya inlägg.
I det här inlägget kommer vi att titta närmare på systemdesignen för Instagrams flöde. Så, låt oss börja.
1. Krav
Funktionell nödvändighet
- Användarens nyhetsflöde skapas från inlägg från andra enheter i systemet som användaren har följt eller är intresserad av.
- Text, bilder och videor kan alla hittas i inlägg.
- Användarens nyhetsflöde bör uppdateras med nya inlägg skapade av andra.
Icke-funktionellt kriterium
- Skapandet av nyhetsflöden bör ske i realtid. Slutanvändaren bör uppleva endast 12 sekunders fördröjning.
- Lägga till ett nytt inlägg: Det bör inte ta mer än 5 sekunder för ett nytt inlägg att dyka upp i en begäran om nyhetsflöde efter att det har skickats till systemet.
2. Uppskattning av kapacitet
- I mars 2021 är jordens befolkning bara 7.8 miljarder människor. Det indikerar att 21 % av världens befolkning är en Facebook DAU (Daily Active User) och 32 % är en Facebook MAU (Monthly Active User) (Monthly Active User). Det är fantastiskt.
- Låt oss låtsas som att systemet vi bygger har 1 miljard DAU för att göra saker enklare.
- Anta att en person följer 500 personer eller företag på Facebook. En grupp eller en sida kan betraktas som en enhet.
Beräknad trafik
Antag att en användare laddar ner nyhetsflödet 10 gånger varje dag i genomsnitt. Så det är ungefär 116K QPS och 1e10 förfrågningar varje dag.
Uppskattningar av lagring
Anta att vi har 500 inlägg från varje användares nyhetsflöde i minnet i genomsnitt för snabb hämtning, och varje inlägg är 1KB stort. Alltså 500 KB per användare, 500 TB för alla DAU:er och 5000 datorer med 100 GB RAM vardera.
3. API:er för system
userId (GUID): användaren vars nyhetsflöde hämtas.
Följande fält är tillgängliga i parametern optional options:
- afterPostId (GUID): hämta nyhetsflödet från inlägget efter detta. Om inte specificerat, få de senaste inläggen.
- count (antal): det maximala antalet inlägg som varje begäran kan returnera. Backend ställer in ett standardmaxantal om inget tillhandahålls.
- excludeReplies (boolesk): förhindrar att svar inkluderas i nyhetsflödet.
- Den returnerade JSON innehåller en lista över nyhetsflödesobjekt.
4. Designa en databas
enheter
- Användare
- entityId, namn, beskrivning och tidsstämpel är alla obligatoriska fält.
- Följande fält är obligatoriska: PostId, title, text, authorId och timestamp.
- tidsstämpel, url och mediaId
Förhållanden
- Andra användare eller enheter kan följas av en användare. (m:n)
- Författare-inlägg: Både användare och enheter kan skapa inlägg. Anta att endast användare kan skapa inlägg för enkelhetens skull. (1:n; authorId kan bäddas in).
- Varje inlägg åtföljs av någon form av media. (1:n)
5. Design på hög nivå
arkitektur
Arbetsflöden
Foderproduktion
När Jay begär sin nyhetsström kommer systemet att göra följande:
- Hämta ID:n för alla personer och saker som Jay följer.
- Samlade inlägg: med dessa ID:n, skaffa de senaste, populära och relevanta inläggen.
- Rangordna inläggen efter deras relevans och timing.
- Cache: spara de skapade flödena och skicka Jay de 20 bästa inläggen.
- När Jay har läst klart de första 20 inläggen skickas ytterligare en förfrågan om att få de nästa 20 inläggen.
Foderfördelning
Anta att Jay följer Aayush och att Aayush lägger upp något nytt. Jays nyhetsflöde måste uppdateras av systemet:
- Hämta ID:n för Aayushs följare.
- Lägg till nya artiklar: Lägg till Aayushs inlägg i nyhetsflödespoolen för dessa ID:s följare.
- Rangordna inläggen efter deras relevans och timing.
- Uppdatera cachen för rankningsinlägget.
- Följare bör meddelas när nya inlägg publiceras.
Komponenter
Användarnas anslutningar underhålls av webbservrar.
De procedurer som anges ovan exekveras av applikationsservern.
Cache och databas:
- Relationell databas användare/enhet
- Relationsdatabas (post)
- Bild/videoattribut: Aayush storge
- Relationell databas metadata
Personliga tjänster:
- Foderproduktion
- Meddelande om flöden
6. Detaljdesign
Generering av foder
Fan-out läs naiv implementering:
Problem med denna slarviga implementering inkluderar:
- Användare med ett stort antal vänner/följare kommer att märka en betydande nedgång eftersom vi måste sålla, slå samman och rangordna ett stort antal inlägg.
- När en användare laddar sin sida konstruerar vi tidslinjen. Detta kan vara trögt och ha mycket latens.
- Varje statusuppdatering kommer att resultera i flödesuppdateringar för alla följare för liveuppdateringar. Detta kan orsaka betydande förseningar i vår Newsfeed Generation Service.
Vi kan förgenerera kronologin och spara den i minnet för att öka effektiviteten.
Offlineproduktion (Fan-out-skrivning)
Vi kan ha dedikerade servrar som ständigt skapar och lagrar användarnas nyhetsflöden i minnet. Vi kan bara leverera nyhetsflödet från den förgenererade, sparade platsen närhelst en användare vill ha det.
Hur många flödesobjekt ska en användares flöde lagras i minnet?
Anpassa utifrån ditt användningsbeteende.
Ska vi skapa ett nyhetsflöde för alla användare (och bevara det i minnet)?
- För personer som inte loggar in så ofta.
- LRU-baserad cachelagring är ett enkelt tillvägagångssätt.
- En bättre lösning är att ta reda på hur användare loggar in. När är det? Vilka vardagar pratar du om?
Publicering av foder
Fanout är processen att skicka ett inlägg till alla dina följare.
Fanout läsning (drag)
När du begär ett nyhetsflöde får systemet en läsbegäran. Fanout read skickar en läsbegäran till alla dina följare och ber dem att läsa deras innehåll.
Alla tillgångar på ett och samma ställe
- Proceduren för att skriva är billig.
- När du läser data är det lättare att använda olika aggregeringsalgoritmer.
Nackdelar:
- För en person med många följare är läsoperationen ganska dyr.
- Användare kommer inte att se färsk data förrän de hämtar den.
- När vi drar för att hämta de senaste inläggen regelbundet är det svårt att hitta rätt pull-kadens, och de flesta pull-förfrågningar kommer att returnera ett tomt svar, vilket slösar med resurser.
Fanout skriv (push)
En skrivförfrågan görs till systemet när du skickar ett nytt inlägg. Skrivbegäran skickas ut till alla dina följare för att uppdatera deras nyhetsflöde med fanoutskrivning.
Pro
- Läsprocessen är billig.
med
- För en användare med miljontals följare, skriva förfarandet är för dyrt.
Rangen på flödet
Istället för att bara ordna flödena kronologiskt försöker dagens rankningsalgoritmer dessutom garantera att artiklar med större relevans prioriteras.
- Välj faktorer som kan hjälpa dig att avgöra relevansen av ett flödesobjekt, som antalet gilla-markeringar, kommentarer och delningar, tidpunkten för uppdateringen av objektet senast om artikeln innehåller foton eller videor och så vidare.
- Beräkna poängen baserat på egenskaperna.
- Använd poängen för att rangordna inläggen.
Ställ in nyckeltal som behållning av användare, annonsintäkter och så vidare för att se hur effektivt vårt rankningssystem är.
Slutsats
Trots att Instagram eller dess moderföretag Facebook är ett stort företag har det en bättre förståelse för systemdesign.
Jag gjorde mitt bästa för att ge dig en sammanfattning på hög nivå av Instagram-flödet.
Jag hoppas att det var till hjälp och att du kommer att använda det bra.
Kommentera uppropet