Inhaltsverzeichnis[Ausblenden][Zeigen]
Instagram Feed ist eine Plattform zum Teilen und Verbinden mit den Menschen und Dingen, die Ihnen wichtig sind. Wenn du Instagram öffnest oder deinen Feed aktualisierst, werden die Fotos und Videos, von denen wir glauben, dass sie dich interessieren, ganz oben angezeigt.
Der News-Feed ist eine Sammlung von Elementen, die Text, Bilder oder Videos enthalten, die von anderen Entitäten im System erstellt wurden und für Sie zum Lesen bestimmt sind. Es ändert sich ständig, während andere Organisationen neue Beiträge veröffentlichen.
In diesem Beitrag werden wir uns das Systemdesign des Instagram-Feeds genau ansehen. Fangen wir also an.
1. Bedarf
Funktionale Notwendigkeit
- Der Newsfeed des Benutzers wird aus Posts von anderen Entitäten im System erstellt, denen der Benutzer gefolgt ist oder an denen er interessiert ist.
- Texte, Bilder und Videos sind alle in Beiträgen zu finden.
- Der Newsfeed des Benutzers sollte mit neuen Beiträgen aktualisiert werden, die von anderen erstellt wurden.
Nichtfunktionales Kriterium
- Die Erstellung von Newsfeeds sollte in Echtzeit erfolgen. Der Endbenutzer sollte nur 12 Sekunden Verzögerung erfahren.
- Anhängen eines neuen Beitrags: Es sollte nicht länger als 5 Sekunden dauern, bis ein neuer Beitrag in einer Newsfeed-Anfrage erscheint, nachdem er an das System übermittelt wurde.
2. Schätzung der Kapazität
- Ab März 2021 beträgt die Weltbevölkerung nur 7.8 Milliarden Menschen. Es zeigt, dass 21 % der Weltbevölkerung ein Facebook DAU (Daily Active User) und 32 % ein Facebook MAU (Monthly Active User) (Monthly Active User) sind. Das ist großartig.
- Nehmen wir an, das System, das wir bauen, hat 1 Milliarde DAU, um die Dinge einfacher zu machen.
- Angenommen, eine Person folgt 500 Personen oder Unternehmen auf Facebook. Eine Gruppe oder eine Seite kann als Entität betrachtet werden.
Geschätzter Verkehr
Nehmen Sie an, dass ein Benutzer den Newsfeed durchschnittlich 10 Mal pro Tag herunterlädt. Das sind also ungefähr 116 QPS und 1e10 Anfragen pro Tag.
Schätzungen der Speicherung
Angenommen, wir halten durchschnittlich 500 Posts aus dem Newsfeed jedes Benutzers im Speicher, um sie schnell abrufen zu können, und jeder Post ist 1 KB groß. Also 500 KB pro Benutzer, 500 TB für alle DAUs und 5000 Computer mit jeweils 100 GB RAM.
3. APIs für Systeme
userId (GUID): der Benutzer, dessen Newsfeed abgerufen wird.
Die folgenden Felder sind im optionalen Optionsparameter verfügbar:
- afterPostId (GUID): Ruft den Newsfeed des Posts ab, der diesem folgt. Wenn nicht angegeben, erhalten Sie die neuesten Beiträge.
- count (number): die maximale Anzahl von Beiträgen, die jede Anfrage zurückgeben kann. Das Backend legt eine standardmäßige maximale Anzahl fest, wenn keine angegeben wird.
- excludeReplies (boolean): Verhindert, dass Antworten in den Newsfeed aufgenommen werden.
- Das zurückgegebene JSON enthält eine Liste von Newsfeed-Einträgen.
4. Entwerfen einer Datenbank
Entities
- Mitglied
- Entitäts-ID, Name, Beschreibung und Zeitstempel sind Pflichtfelder.
- Folgende Felder sind Pflichtfelder: PostId, Title, Text, AuthorId und Timestamp.
- Zeitstempel, URL und Medien-ID
Beziehungen
- Andere Benutzer oder Entitäten können von einem Benutzer verfolgt werden. (m:n)
- Autor-Beitrag: Sowohl Benutzer als auch Entitäten können Beiträge erstellen. Gehen Sie der Einfachheit halber davon aus, dass nur Benutzer Beiträge erstellen können. (1:n; authorId ist einbettbar).
- Jeder Beitrag wird von irgendeiner Form von Medien begleitet. (1:n)
5. High-Level-Design
Architektur
Workflows
Futtermittelproduktion
Wenn Jay ihren Nachrichtenstream anfordert, wird das System Folgendes tun:
- Rufen Sie die IDs aller Personen und Dinge ab, denen Jay folgt.
- Aggregierte Posts: Erhalten Sie anhand dieser IDs die neuesten, beliebtesten und relevantesten Posts.
- Ordnen Sie die Beiträge nach ihrer Relevanz und ihrem Zeitpunkt.
- Cache: Speichern Sie die erstellten Feeds und senden Sie Jay die 20 besten Posts.
- Wenn Jay die ersten 20 Beiträge gelesen hat, wird eine weitere Anfrage gesendet, um die nächsten 20 Beiträge zu erhalten.
Futterverteilung
Angenommen, Jay folgt Aayush und Aayush postet etwas Neues. Jays Newsfeed muss vom System aktualisiert werden:
- Rufen Sie die IDs von Aayushs Anhängern ab.
- Neue Artikel hinzufügen: Fügen Sie Aayushs Beitrag zum News-Feed-Pool der Follower dieser IDs hinzu.
- Ordnen Sie die Beiträge nach ihrer Relevanz und ihrem Zeitpunkt.
- Aktualisieren Sie den Cache des Ranking-Beitrags.
- Follower sollten benachrichtigt werden, wenn neue Beiträge veröffentlicht werden.
Komponenten
Die Verbindungen der Benutzer werden von Webservern verwaltet.
Die oben angegebenen Prozeduren werden vom Anwendungsserver ausgeführt.
Cache und Datenbank:
- Benutzer/Entität der relationalen Datenbank
- Relationale Datenbank (post)
- Bild-/Videoattribut: Aayush storge
- Metadaten relationaler Datenbanken
Personalisierte Dienstleistungen:
- Futtermittelproduktion
- Benachrichtigung über Feeds
6. Detailliertes Design
Futtererzeugung
Fan-Out-Read-Naive-Implementierung:
Zu den Problemen mit dieser schlampigen Implementierung gehören:
- Benutzer mit einer großen Anzahl von Freunden/Followern werden eine deutliche Verlangsamung bemerken, da wir eine große Anzahl von Postings sichten, zusammenführen und klassifizieren müssen.
- Wenn ein Benutzer seine Seite lädt, erstellen wir die Zeitachse. Dies kann träge sein und viel Latenz haben.
- Jede Statusaktualisierung führt zu Feed-Aktualisierungen für alle Follower für Live-Updates. Dies kann zu erheblichen Verzögerungen bei unserem Newsfeed-Generierungsdienst führen.
Wir können die Chronologie vorab generieren und im Speicher speichern, um die Effizienz zu steigern.
Offline-Produktion (Fan-out-Schreiben)
Wir können dedizierte Server haben, die ständig die Newsfeeds der Benutzer erstellen und im Speicher speichern. Wir können den News-Feed einfach vom vorgenerierten, gespeicherten Ort aus liefern, wann immer ein Benutzer dies wünscht.
Wie viele Feedelemente sollte der Feed eines Benutzers im Arbeitsspeicher gespeichert werden?
Passen Sie sich an Ihr Nutzungsverhalten an.
Sollten wir einen Newsfeed für alle Benutzer erstellen (und ihn im Gedächtnis behalten)?
- Für Leute, die sich nicht oft einloggen.
- LRU-basiertes Caching ist ein einfacher Ansatz.
- Eine bessere Lösung besteht darin, herauszufinden, wie sich Benutzer anmelden. Wann ist das der Fall? Von welchen Wochentagen sprichst du?
Veröffentlichung von Feeds
Fanout ist der Vorgang, bei dem ein Beitrag an alle Ihre Follower gesendet wird.
Fanout lesen (ziehen)
Wenn Sie einen Newsfeed anfordern, erhält das System eine Leseanforderung. Fanout Read sendet eine Leseanfrage an alle Ihre Follower und bittet sie, ihren Inhalt zu lesen.
Vorteile:
- Das Schreibverfahren ist kostengünstig.
- Beim Lesen von Daten ist es einfacher, verschiedene Aggregationsalgorithmen zu verwenden.
Nachteile:
- Für eine Person mit vielen Followern ist der Lesevorgang ziemlich teuer.
- Benutzer sehen keine neuen Daten, bis sie sie abrufen.
- Wenn wir regelmäßig ziehen, um die neuesten Beiträge abzurufen, ist es schwierig, die richtige Pull-Kadenz zu finden, und die meisten Pull-Anforderungen geben eine leere Antwort zurück, wodurch Ressourcen verschwendet werden.
Fanout-Schreiben (Push)
Wenn Sie einen neuen Beitrag senden, wird eine Schreibanfrage an das System gestellt. Die Schreibanfrage wird an alle Ihre Follower gesendet, um ihren Newsfeed mit Fanout Write zu aktualisieren.
Pro
- Der Lesevorgang ist kostengünstig.
Mit
- Für einen Benutzer mit Millionen von Followern ist die schreiben Verfahren ist zu teuer.
Der Rang des Feeds
Anstatt die Feeds nur chronologisch zu ordnen, versuchen heutige Ranking-Algorithmen zusätzlich zu gewährleisten, dass Artikel mit höherer Relevanz priorisiert werden.
- Wählen Sie Faktoren aus, die Ihnen bei der Entscheidung über die Relevanz eines Feed-Elements helfen können, z. B. die Anzahl der Likes, Kommentare und Freigaben, die Uhrzeit der letzten Aktualisierung des Elements, falls der Artikel Fotos oder Videos enthält, und so weiter.
- Berechnen Sie die Punktzahl basierend auf den Merkmalen.
- Verwenden Sie die Punktzahl, um die Beiträge zu ordnen.
Richten Sie KPIs wie Benutzerbindung, Werbeeinnahmen usw. ein, um zu sehen, wie effektiv unser Ranking-System ist.
Zusammenfassung
Trotz der Tatsache, dass Instagram oder sein Mutterunternehmen Facebook ein riesiger Konzern ist, hat es ein besseres Verständnis dafür System-Design.
Ich habe mein Bestes gegeben, um Ihnen eine allgemeine Zusammenfassung des Instagram-Feeds zu bieten.
Ich hoffe, es war hilfreich und Sie werden es gut gebrauchen.
Hinterlassen Sie uns einen Kommentar