Dies ist ein Gastbeitrag von Ankit Sirmorya. Ankit arbeitet als Device Studying Lead/Sr. Device Studying Engineer bei Amazon und hat mehrere Device-Studying-Initiativen im Amazon-Ökosystem geleitet. Ankit hat an der Anwendung von maschinellem Lernen gearbeitet, um mehrdeutige Geschäftsprobleme zu lösen und das Kundenerlebnis zu verbessern. Beispielsweise hat er eine Plattform zum Experimentieren mit verschiedenen Hypothesen auf Amazon-Produktseiten mithilfe von Reinforcement-Studying-Techniken geschaffen. Derzeit ist er in der Alexa Buying groceries-Organisation tätig, wo er auf maschinellem Lernen basierende Lösungen entwickelt, um Kunden personalisierte Hinweise zur Nachbestellung zu senden, um deren Erfahrung zu verbessern.

Problemstellung

Entwerfen Sie eine Foto-Sharing-Plattform ähnlich wie Instagram, auf der Benutzer ihre Fotos hochladen und mit ihren Followern teilen können. Anschließend können die Benutzer personalisierte Feeds anzeigen, die Beiträge von allen anderen Benutzern enthalten, denen sie folgen.

Anforderungen sammeln

Im Visier

Die Anwendung sollte in der Lage sein, die folgenden Anforderungen zu unterstützen.

  • Benutzer sollten in der Lage sein, Fotos hochzuladen und die von ihnen hochgeladenen Fotos anzuzeigen.
  • Benutzer sollten anderen Benutzern folgen können.
  • Benutzer können Feeds anzeigen, die Posts von Benutzern enthalten, denen sie folgen.
  • Benutzer sollten die Beiträge liken und kommentieren können.

Außer Reichweite

  • Senden und Empfangen von Nachrichten von anderen Benutzern.
  • Generieren von auf maschinellem Lernen basierenden personalisierten Empfehlungen, um neue Personen, Fotos, Movies und Geschichten zu entdecken, die für das eigene Interesse related sind.

Design auf hohem Niveau

Die Architektur

Wenn der Server eine Anfrage für eine Aktion (Put up, Like usw.) von einem Shopper erhält, führt er zwei parallele Operationen durch: i) Behalten der Aktion im Datenspeicher ii) Veröffentlichen der Aktion in einem Streaming-Datenspeicher für ein Pub-Sub-Modell . Danach lesen die verschiedenen Dienste (z. B. Person Feed Provider, Media Counter Provider) die Aktionen aus dem Streaming-Datenspeicher und führen ihre spezifischen Aufgaben aus. Der Streaming-Datenspeicher macht das Gadget erweiterbar, um andere Anwendungsfälle (z. B. Mediensuchindex, Ortssuchindex usw.) in Zukunft zu unterstützen.

FUN FACT: In diesem Vortrag spricht Rodrigo Schmidt, Director of Engineering bei Instagram, über die unterschiedlichen Herausforderungen, denen sie bei der Skalierung der Dateninfrastruktur bei Instagram gegenüberstanden.

Systemkomponenten

Das Gadget wird aus mehreren Mikrodiensten bestehen, die jeweils eine eigene Aufgabe erfüllen. Wir werden eine Graphdatenbank wie Neo4j verwenden, um die Informationen zu speichern. Der Grund, warum wir uns für ein Diagrammdatenmodell entschieden haben, ist, dass unsere Daten komplexe Beziehungen zwischen Dateneinheiten wie Benutzern, Beiträgen und Kommentaren als Knoten des Diagramms enthalten. Danach verwenden wir Kanten des Diagramms, um Beziehungen wie Follows, Likes, Kommentare usw. zu speichern. Darüber hinaus können wir Spaltendatenbanken wie Cassandra verwenden, um Informationen wie Benutzer-Feeds, Aktivitäten und Zähler zu speichern.

Komponentendesign

Posten auf Instagram

Abb. 2: Synchroner und asynchroner Prozess zum Posten auf Instagram

Es gibt zwei Hauptprozesse, die ausgeführt werden, wenn ein Benutzer ein Foto auf Instagram veröffentlicht. Erstens der synchrone Prozess, der für das Hochladen von Bildinhalten in den Dateispeicher, das Persistieren der Medienmetadaten im Grafikdatenspeicher, das Zurücksenden der Bestätigungsnachricht an den Benutzer und das Auslösen des Prozesses zum Aktualisieren der Benutzeraktivität verantwortlich ist. Der zweite Prozess erfolgt asynchron, indem die Benutzeraktivität in einem spaltenförmigen Datenspeicher (Cassandra) beibehalten und der Prozess ausgelöst wird, um den Feed von Followern von nicht prominenten Benutzern (mit einigen tausend Followern) vorab zu berechnen. Wir berechnen keine Feeds für prominente Benutzer (mit mehr als 1 Million Followern), da der Prozess zum Auffächern der Feeds an alle Follower extrem rechen- und I/O-intensiv sein wird.

API-Design

Wir haben unten das API-Design zum Posten eines Bildes auf Instagram bereitgestellt. Wir senden die Datei und die Daten in einer Anfrage unter Verwendung des Inhaltstyps multipart/form-data. Die MultiPart/Shape-Daten enthalten eine Reihe von Teilen. Von jedem Teil wird erwartet, dass er einen Content material-Disposition-Header enthält [RFC 2183] wobei der Dispositionstyp “Formulardaten” ist.

Vorberechnen von Feeds

Dieser Prozess wird ausgeführt, wenn nicht prominente Benutzer einen Beitrag auf Instagram erstellen. Es wird ausgelöst, wenn eine Nachricht in die Benutzer-Feed-Provider-Warteschlange hinzugefügt wird. Sobald die Nachricht der Warteschlange hinzugefügt wurde, ruft der Benutzer-Feed-Dienst den Follower-Dienst auf, um die Liste der Follower des Benutzers abzurufen. Danach wird der Beitrag dem Feed aller Follower im spaltenweisen Datenspeicher hinzugefügt.

Abrufen des Benutzer-Feeds

Wenn ein Benutzer einen Feed anfordert, sind zwei parallele Threads am Abrufen der Benutzerfeeds beteiligt, um die Latenz zu optimieren. Der erste Thread ruft die Feeds von nicht prominenten Benutzern ab, denen der Benutzer folgt. Diese Feeds werden durch den Fan-out-Mechanismus gefüllt, der oben im Abschnitt PreCompute Feeds beschrieben ist. Der zweite Thread ist für das Abrufen der Feeds von prominenten Benutzern verantwortlich, denen der Benutzer folgt. Danach führt der Benutzer-Feed-Dienst die Feeds von prominenten und nicht prominenten Benutzern zusammen und sendet die zusammengeführten Feeds an den Benutzer zurück, der den Feed angefordert hat.

API-Design

Datenmodelle

Graph-Datenmodelle

Wir können eine Diagrammdatenbank wie Neo4j verwenden, die Datenentitäten wie Benutzerinformationen, Beiträge, Kommentare usw. als Knoten im Diagramm speichert. Die Kanten zwischen den Knoten werden verwendet, um die Beziehung zwischen Dateneinheiten wie Followern, Posts, Kommentaren, Likes und Antworten zu speichern. Alle Knoten werden für schnellere Suchen zu einem Index namens nodeIndex hinzugefügt. Wir haben uns für diese NoSQL-basierte Lösung gegenüber relationalen Datenbanken entschieden, da sie die Skalierbarkeit für Hierarchien bietet, die über zwei Ebenen hinausgehen, und die Erweiterbarkeit aufgrund des schemalosen Verhaltens der NoSQL-Datenspeicherung.

Von Graph Database unterstützte Beispielabfragen

Holen Sie sich alle Anhänger von Jeff Bezos

Node jeffBezos = nodeIndex.get(“userId”, “user004”);
Listing jeffBezosFollowers = new ArrayList();

for (Courting courting: jeffBezos.getRelationships(INGOING, FOLLOWS)) {
    jeffBezosFollowers.upload(courting.getStartNode());
}

Rufen Sie alle Beiträge von Invoice Gates ab

Node billGates = nodeIndex.get(“userId”, “user001”);
Listing billGatesPosts = new ArrayList();

for (Courting courting: billGates.getRelationships(OUTGOING, POSTS)) {
    billGatesPosts.upload(courting.getEndNode());
}

Rufen Sie alle Posts von Invoice Gates ab, die Jeff Bezos kommentiert hat

Listing commentsOnBillGatesPosts = new ArrayList<>();

for(Node billGatesPost : billGatesPosts) {
     for (Courting courting: billGates.getRelationships(INGOING, COMMENTED_ON)) {
	commentsOnBillGatesPosts.upload(courting.getStartNode());
     }
}

Listing jeffBezosComments = new ArrayList();

for (Courting courting: jeffBezos.getRelationships(OUTGOING, COMMENTS)) {
    jeffBezosComments.upload(courting.getEndNode());
}

Listing jeffBezosCommentsOnBillGatesPosts = commentsOnBillGatesPosts.intersect(jeffBezosComments);

Spaltenförmige Datenmodelle

Wir werden spaltenweise Datenspeicher wie Cassandra verwenden, um Datenentitäten wie Benutzer-Feeds und Aktivitäten zu speichern. Jede Zeile enthält Feed-/Aktivitätsinformationen des Benutzers. Wir können auch eine TTL-basierte Funktion haben, um ältere Posts zu entfernen. Das Datenmodell sieht in etwa so aus:

User_id -> Listing

FUN FACT: In diesem Vortrag hat Dikang Gu, ein Softwareentwickler im Infra-Kernteam von Instagram, erwähnt, wie sie Cassandra verwenden, um kritische Anwendungsfälle, hohe Skalierbarkeitsanforderungen und einige Problempunkte zu bedienen.

Streaming-Datenmodell

Wir können Cloud-Technologien wie Amazon Kinesis oder Azure Flow Analytics zum Sammeln, Verarbeiten und Analysieren von Echtzeit-Streaming-Daten verwenden, um rechtzeitig Einblicke zu erhalten und schnell auf neue Informationen (z. B. ein neues „Gefällt mir“, Kommentar usw.) zu reagieren. Nachfolgend haben wir die denormalisierte Shape einiger wichtiger Streaming-Dateneinheiten und -Aktionen aufgelistet.

Die Datenentitäten EIN und B oben zeigen die Container, die denormalisierte Informationen über die Benutzer und ihre Posts enthalten. Anschließend die Datenentitäten C und D bezeichnen die verschiedenen Aktionen, die Benutzer ausführen können. Die Entität C bezeichnet das Ereignis, bei dem ein Benutzer einen Beitrag und eine Entität magazine D bezeichnet die Aktion, wenn ein Benutzer einem anderen Benutzer folgt. Diese Aktionen werden von den zugehörigen Microservices aus dem Flow ausgelesen und entsprechend verarbeitet. Zum Beispiel die LikeEvent kann von gelesen werden Medienzählerdienst und wird verwendet, um die Medienanzahl im Datenspeicher zu aktualisieren.

Optimierung

Wir werden einen Cache mit einer LRU-basierten Entfernungsrichtlinie zum Zwischenspeichern von Benutzer-Feeds aktiver Benutzer verwenden. Dies reduziert nicht nur die Gesamtlatenz beim Anzeigen der Benutzer-Feeds für Benutzer, sondern verhindert auch die Neuberechnung von Benutzer-Feeds.

Ein weiterer Optimierungsbereich liegt darin, die besten Inhalte in den Benutzerfeeds bereitzustellen. Wir können dies tun, indem wir die neuen Feeds (die nach der letzten Anmeldung des Benutzers generiert werden) von denen abstufen, denen der Benutzer folgt. Wir können Techniken des maschinellen Lernens anwenden, um die Benutzer-Feeds zu ordnen, indem wir den einzelnen Feeds Punkte zuweisen, die die Wahrscheinlichkeit von Klicks, Likes, Kommentaren usw. angeben. Wir können dies tun, indem wir jeden Feed durch einen Merkmalsvektor darstellen, der Informationen über den Benutzer, den Feed und die Interaktionen enthält, die der Benutzer mit den Personen im Feed hatte (z. B. ob der Benutzer die vorherigen Feeds angeklickt/gefällt mir/kommentiert hat von den Personen in der Geschichte). Es ist offensichtlich, dass die wichtigsten Funktionen für das Feed-Score mit dem sozialen Netzwerk zusammenhängen werden. Einige der Schlüssel zum Verständnis des Benutzernetzwerks sind unten aufgeführt.

  • Von wem ist der Benutzer ein enger Anhänger? Beispielsweise ist ein Benutzer ein enger Anhänger von Elon Musk, während ein anderer Benutzer ein enger Anhänger von Gordon Ramsay sein kann.
  • Wessen Fotos gefallen dem Person immer?
  • Wessen Hyperlinks sind für den Nutzer am interessantesten?

Wir können tiefe neuronale Netze verwenden, die die verschiedenen Merkmale (> 100.000 dichte Merkmale) aufnehmen würden, die wir zum Trainieren des Modells benötigen. Diese Merkmale werden durch die n-fachen Schichten geleitet und zur Vorhersage der Wahrscheinlichkeit der verschiedenen Ereignisse (Gefällt mir, Kommentare, Freigaben usw.) verwendet.

FUN FACT: In diesem Vortrag spricht Lars Backstrom, VP of Engineering @ Fb, über das maschinelle Lernen, mit dem personalisierte Newsfeeds für Benutzer erstellt werden. Er spricht über den klassischen maschinellen Lernansatz, den sie in den Anfangsphasen zur Personalisierung von Newsfeeds mithilfe von Entscheidungsbäumen und logistischer Regression verwendet haben. Anschließend spricht er über die Verbesserungen, die sie bei der Verwendung neuronaler Netze beobachtet haben.

Verweise

  • https://www.youtube.com/watch?v=_BfMH4GQWnk
  • https://www.youtube.com/watch?v=hnpzNAPiC0E
  • https://instagram-engineering.com/what-powers-instagram-hundreds-of-instances-dozens-of-technologies-adf2e22da2ad
  • https://instagram-engineering.com/types-for-python-http-apis-an-instagram-story-d3c3a207fdb7
  • http://highscalability.com/weblog/2012/4/9/the-instagram-architecture-facebook-bought-for-a-cool-billio.html
  • https://doctors.oracle.com/cloud/newest/marketingcs_gs/OMCAC/op-api-rest-1.0-assets-image-content-post.html
  • https://instagram-engineering.com/under-the-hood-instagram-in-2015-8e8aff5ab7c2

https://aspiringsysadmin.com/