Inhoudsopgave[Zich verstoppen][Laten zien]
Instagram Feed is een platform voor het delen en verbinden met de mensen en dingen die belangrijk voor je zijn. Wanneer je Instagram opent of je feed vernieuwt, worden de foto's en video's waarvan we denken dat je ze interessant vindt bovenaan weergegeven.
De nieuwsfeed is een verzameling items met tekst, afbeeldingen of video's die door andere entiteiten in het systeem zijn gemaakt en die u kunt lezen. Het verandert altijd, terwijl andere organisaties nieuwe berichten plaatsen.
In dit bericht zullen we het systeemontwerp van de Instagram-feed nauwkeurig bekijken. Laten we beginnen.
1. Vereisten
Functionele noodzaak
- De nieuwsfeed van de gebruiker wordt gemaakt op basis van berichten van andere entiteiten in het systeem die de gebruiker heeft gevolgd of waarin hij geïnteresseerd is.
- Tekst, afbeeldingen en video's zijn allemaal te vinden in berichten.
- De nieuwsfeed van de gebruiker moet worden bijgewerkt met nieuwe berichten die door anderen zijn gemaakt.
Niet-functioneel criterium
- Het creëren van nieuwsfeeds moet in realtime plaatsvinden. De eindgebruiker zou slechts 12 seconden vertraging moeten ervaren.
- Een nieuw bericht toevoegen: het zou niet meer dan 5 seconden moeten duren voordat een nieuw bericht in een nieuwsfeedverzoek verschijnt nadat het naar het systeem is verzonden.
2. Schatting van de capaciteit
- Vanaf maart 2021 telt de wereldbevolking slechts 7.8 miljard mensen. Het geeft aan dat 21% van de wereldbevolking een Facebook DAU (Daily Active User) is en 32% een Facebook MAU (Monthly Active User) (Maandly Active User). Dat is geweldig.
- Laten we doen alsof het systeem dat we aan het bouwen zijn 1 miljard DAU heeft om dingen gemakkelijker te maken.
- Stel dat een persoon 500 mensen of bedrijven volgt op Facebook. Een groep of een pagina kan als een entiteit worden beschouwd.
Geschat verkeer
Stel dat een gebruiker de nieuwsfeed gemiddeld 10 keer per dag downloadt. Het zijn dus ongeveer 116K QPS en 1e10 verzoeken per dag.
Schattingen van opslag
Stel dat we gemiddeld 500 berichten van de nieuwsfeed van elke gebruiker in het geheugen bewaren voor snel ophalen, en elk bericht is 1 KB groot. Dus 500 KB per gebruiker, 500 TB voor alle DAU's en 5000 computers met elk 100 GB RAM.
3. API's voor systemen
userId (GUID): de gebruiker wiens nieuwsfeed wordt opgehaald.
De volgende velden zijn beschikbaar in de parameter optionele opties:
- afterPostId (GUID): haal de nieuwsfeed op van de post die hierop volgt. Als dit niet is opgegeven, haalt u de meest recente berichten op.
- count (number): het maximale aantal berichten dat elk verzoek kan retourneren. De backend stelt een standaard maximum aantal in als er geen is opgegeven.
- uitsluitingReplies (boolean): voorkomt dat antwoorden worden opgenomen in de nieuwsfeed.
- De geretourneerde JSON bevat een lijst met nieuwsfeeditems.
4. Een database ontwerpen
Entiteiten
- Gebruiker
- entiteitId, naam, beschrijving en tijdstempel zijn allemaal verplichte velden.
- De volgende velden zijn vereist: PostId, titel, tekst, authorId en tijdstempel.
- tijdstempel, url en mediaId
Relaties
- Andere gebruikers of entiteiten kunnen worden gevolgd door een gebruiker. (m:n)
- Auteur-Post: Zowel gebruikers als entiteiten kunnen berichten maken. Neem voor de eenvoud aan dat alleen gebruikers berichten kunnen maken. (1:n; authorId kan worden ingesloten).
- Elke post gaat vergezeld van een vorm van media. (1:n)
5. Ontwerp op hoog niveau
Architectuur
Workflows
Voerproductie
Wanneer Jay haar nieuwsstream opvraagt, doet het systeem het volgende:
- Haal de ID's op van alle mensen en dingen die Jay volgt.
- Verzamelde berichten: op basis van die ID's, verkrijgt u de meest recente, populaire en relevante berichten.
- Rangschik de berichten op basis van hun relevantie en timing.
- Cache: sla de gemaakte feeds op en stuur Jay de top 20 berichten.
- Wanneer Jay klaar is met het lezen van de eerste 20 berichten, wordt er nog een verzoek verzonden om de volgende 20 berichten te ontvangen.
Voerdistributie
Stel dat Jay Aayush volgt en dat Aayush iets nieuws plaatst. Jay's nieuwsfeed moet door het systeem worden bijgewerkt:
- Haal de ID's van de volgers van Aayush op.
- Nieuwe artikelen toevoegen: Voeg Aayush's post toe aan de nieuwsfeedpool van de volgers van die ID's.
- Rangschik de berichten op basis van hun relevantie en timing.
- Werk de cache van de ranglijst bij.
- Volgers moeten op de hoogte worden gesteld wanneer nieuwe berichten worden gepubliceerd.
COMPONENTEN
De verbindingen van gebruikers worden onderhouden door webservers.
Bovenstaande procedures worden uitgevoerd door de applicatieserver.
Cache en database:
- Relationele database gebruiker/entiteit
- Relationele database (post)
- Afbeelding/video-kenmerk: Aayush-storge
- Metadata relationele database
Gepersonaliseerde diensten:
- Voerproductie
- Melding van feeds
6. Gedetailleerd ontwerp:
Generatie van voer
Fan-out lees naïeve implementatie:
Problemen met deze slordige implementatie zijn onder meer:
- Gebruikers met een groot aantal vrienden/volgers zullen een aanzienlijke vertraging opmerken omdat we een groot aantal berichten moeten filteren, samenvoegen en rangschikken.
- Wanneer een gebruiker zijn pagina laadt, bouwen we de tijdlijn. Dit kan traag zijn en veel latentie hebben.
- Elke statusupdate resulteert in feedupdates voor alle volgers voor live updates. Dit kan aanzienlijke vertragingen veroorzaken in onze Newsfeed Generation-service.
We kunnen de chronologie vooraf genereren en in het geheugen opslaan om de efficiëntie te verhogen.
Offline productie (Fan-out schrijven)
We kunnen dedicated servers hebben die constant nieuwsfeeds van gebruikers maken en opslaan in het geheugen. We kunnen de nieuwsfeed gewoon leveren vanaf de vooraf gegenereerde, opgeslagen locatie wanneer een gebruiker dat wil.
Hoeveel feeditems moeten in het geheugen van een gebruiker worden opgeslagen?
Pas je aan op basis van je gebruiksgedrag.
Moeten we een nieuwsfeed maken voor alle gebruikers (en deze in het geheugen bewaren)?
- Voor mensen die niet vaak inloggen.
- Op LRU gebaseerde caching is een eenvoudige benadering.
- Een betere oplossing is om erachter te komen hoe gebruikers inloggen. Wanneer is het? Over welke weekdagen heb je het?
Publicatie van feed
Fanout is het proces waarbij je een bericht naar al je volgers stuurt.
Fanout lezen (trekken)
Wanneer u een nieuwsfeed aanvraagt, ontvangt het systeem een leesverzoek. Fanout read stuurt een leesverzoek naar al je volgers en vraagt hen om hun inhoud te lezen.
Voors:
- De procedure van schrijven is goedkoop.
- Bij het lezen van gegevens is het gemakkelijker om verschillende aggregatie-algoritmen te gebruiken.
nadelen:
- Voor een persoon met veel volgers is de leesoperatie vrij duur.
- Gebruikers zullen geen nieuwe gegevens zien totdat ze deze ophalen.
- Wanneer we regelmatig pullen om de meest recente berichten op te halen, is het moeilijk om de juiste pull-cadans te vinden, en de meeste pull-verzoeken zullen een leeg antwoord opleveren, wat middelen verspilt.
Fanout schrijven (push)
Er wordt een schrijfverzoek aan het systeem gedaan wanneer u een nieuw bericht verzendt. Het schrijfverzoek wordt naar al je volgers gestuurd om hun nieuwsfeed bij te werken met fanout write.
Pro
- Het leesproces is goedkoop.
met
- Voor een gebruiker met miljoenen volgers is de schrijven procedure is te duur.
De rang van de Feed
In plaats van de feeds alleen chronologisch te ordenen, proberen de huidige rangschikkingsalgoritmen bovendien te garanderen dat items met een grotere relevantie prioriteit krijgen.
- Kies factoren die u kunnen helpen bij het bepalen van de relevantie van een feeditem, zoals het aantal vind-ik-leuks, opmerkingen en shares, het tijdstip waarop het item voor het laatst is bijgewerkt als het artikel foto's of video's bevat, enzovoort.
- Bereken de score op basis van de kenmerken.
- Gebruik de score om de berichten te rangschikken.
Stel KPI's in zoals gebruikersretentie, advertentie-inkomsten, enzovoort om te zien hoe effectief ons rankingsysteem is.
Conclusie
Ondanks het feit dat Instagram of het moederbedrijf Facebook een enorm bedrijf is, heeft het een beter begrip van systeem ontwerp.
Ik heb mijn best gedaan om je een samenvatting op hoog niveau van de Instagram-feed te geven.
Ik hoop dat het nuttig was en dat je het goed zult gebruiken.
Laat een reactie achter