4 Stimmen

Wie macht Facebook das?

Ist dir schon mal aufgefallen, dass auf Facebook steht "3 Freunden und 33 anderen gefällt das"? Ich habe mich gefragt, wie man das am besten macht. Ich glaube nicht, dass es effizient ist, die Freundesliste und die Liste der Nutzer, denen "dies" gefallen hat, durchzugehen und sie zu vergleichen! Wird dies in der Datenbank festgehalten? Das würde die Datenbank sehr groß werden lassen. Was meint ihr dazu?

Danke!

8voto

Welbog Punkte 57431

Ich würde vermuten, dass sie draußen ihre friends Tisch mit ihren likes Tabelle, um sowohl reguläre Likes als auch Freund-Likes gleichzeitig zu zählen.

Mit den richtigen Indizes wäre es überhaupt keine langsame Abfrage. Riesige Datenbanken sind nicht zwangsläufig langsam, es gibt also keinen Grund, all diese Informationen nicht in einer Datenbank zu speichern. Der Trick besteht darin, dafür zu sorgen, dass die Indizes und Partitionen (falls vorhanden) gut eingerichtet sind.

5voto

Carl Russmann Punkte 1709

Facebook verwendet Cassandra eine NoSQL-Datenbank, zumindest für einige Dinge. Hier ist eine detailliertere Diskussion darüber, was einige der größeren Social-Media-Sites tun, um diese Probleme zu lösen:

http://www.25hoursaday.com/weblog/2009/09/10/BuildingScalableDatabasesDenormalizationTheNoSQLMovementAndDigg.aspx

Dort gibt es viel Interessantes zu lesen, wenn Sie den Links zum Digg-Blogbeitrag usw. folgen.

4voto

Brian R. Bondy Punkte 325712

Ja, sie behalten sie definitiv in ihrer Datenbank, da sie definitiv mehr als einen Server haben, der auf die Daten zugreifen muss.

Was die Skalierbarkeit anbelangt, so bin ich mir sicher, dass sie eine Menge Caching verwenden.

Hier ist ein Beispiel:

Wenn Sie 1 Million Zeilen zu durchsuchen haben, kann ein Index O(logn) = 20 Operationen (im schlimmsten Fall) durchführen, nur um das zu finden, was Sie brauchen.

Für 2 Millionen brauchen Sie nur 21 Operationen (im schlimmsten Fall), um das zu finden, was Sie brauchen.

Jedes Mal, wenn Sie die Anzahl der zu durchlaufenden Benutzer verdoppeln, brauchen Sie nur eine weitere Operation (im schlimmsten Fall) mit einem O(logn)-Index.

Sie verfügen auch über eine verteilte Architektur oder eine geclusterte Datenbank.

3voto

gaurav sarda Punkte 31

Facebook muss einen Trigger verwenden (der automatisch ausgeführt wird, sobald ein Ereignis eintritt).

Angenommen, ein Trigger wird erstellt, um die Anzahl und die Namen der Personen zu speichern, denen der Status gefallen hat, dann wird er jedes Mal ausgeführt, wenn jemandem Ihr Status gefällt, und zwar implizit (automatisch).

Das macht den Vorgang viel zu einfach und Facebook muss die Datenbank nicht manuell aktualisieren oder eine große Datenbank dafür speichern. Außerdem ist dieser Ansatz schneller.

2voto

Bei der Entwicklung einer Software für soziale Netzwerke (mothsorchid.com) habe ich festgestellt, dass die einzige Möglichkeit, dieses Problem zu lösen, darin besteht, Benachrichtigungsströme im Voraus zwischenzuspeichern. Man fragt die Datenbank nicht beim Laden der Seite ab, um zu zählen, wie vielen Freunden und anderen Personen "das gefallen hat". Wenn jemandem etwas "gefällt", wird das auf dem Objekt aufgezeichnet, und beim Abrufen des Objekts kann man es mit der Freundesliste des aktuellen Benutzers vergleichen. Wenn jemand sein Profil aktualisiert/einen Kommentar abgibt/etc. sendet es Benachrichtigungsobjekte an Freunde, die in deren Feeds zwischengespeichert sind. Das spart enorm viel Datenbankarbeit auf Kosten des Speicherplatzes, aber Speicherplatz ist billig.

Facebook verwendet dazu das DBMS Cassandra, das sich wahrscheinlich ein wenig von dem unterscheidet, was Sie im Sinn haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X