TL? DR:
Χρησιμοποιούν μια αρχιτεκτονική στοίβα με προσωρινά αποθηκευμένες γραφήματα για τα πάντα πάνω από τον πυθμένα της MySQL του stack τους.
Long Απάντηση:
Έκανα κάποια έρευνα για αυτό τον εαυτό μου γιατί ήμουν περίεργος πώς χειρίζονται τεράστιο ποσό των δεδομένων και την αναζήτηση σε ένα γρήγορο τρόπο. Έχω δει ανθρώπους να διαμαρτύρονται για custom made σενάρια κοινωνικό δίκτυο να γίνει αργά, όταν η βάση χρηστών μεγαλώνει. Μετά έκανα κάποια συγκριτική αξιολόγηση εαυτό μου με μόνο 10k χρήστες και 2,5 εκατομμύρια φίλος συνδέσεις - ούτε καν προσπαθεί να ενοχλεί σχετικά με τα δικαιώματα της ομάδας και συμπαθεί και θέσεις τοίχο - γρήγορα αποδείχθηκε ότι αυτή η προσέγγιση είναι λανθασμένη. Έτσι έχω περάσει κάποιο χρόνο ψάχνοντας στο διαδίκτυο για το πώς να το κάνουμε καλύτερα και τέθηκε σε όλη αυτή την επίσημη άρθρου Facebook:
Έχω πραγματικά σας προτείνουμε να παρακολουθήσετε την παρουσίαση του πρώτου παραπάνω σύνδεσμο πριν συνεχίσετε την ανάγνωση. Είναι ίσως η καλύτερη εξήγηση για το πώς λειτουργεί FB πίσω από τις σκηνές που μπορείτε να βρείτε.
Το βίντεο και το άρθρο σας λέει μερικά πράγματα:
- Είναι χρησιμοποιώντας MySQL στο πολύ κάτω μέρος του stack τους
- Πάνω από το SQL DB υπάρχει το στρώμα ΤΑΟ που περιέχει τουλάχιστον δύο επίπεδα προσωρινή αποθήκευση και τη χρήση γραφημάτων για να περιγράψει τις συνδέσεις.
- Δεν μπόρεσα να βρω τίποτα για το τι λογισμικό / DB που πραγματικά χρησιμοποιούν για προσωρινά αποθηκευμένες γραφικές παραστάσεις τους
Ας ρίξουμε μια ματιά σε αυτό, συνδέσεις φίλος είναι πάνω αριστερά:

Λοιπόν, αυτό είναι ένα γράφημα. :) Δεν σας πω πώς να το χτίσει σε SQL, υπάρχουν διάφοροι τρόποι για να το κάνουμε, αλλά αυτό το site έχει ένα καλό ποσό των διαφορετικών προσεγγίσεων. Προσοχή: Σκεφτείτε ότι μια σχεσιακή ΒΔ είναι αυτό που είναι: Είναι σκέψης για την αποθήκευση κανονικοποιημένα δεδομένα, δεν είναι μια δομή γράφημα. Έτσι δεν θα εκτελέσει τόσο καλή όσο μια εξειδικευμένη βάση δεδομένων γράφημα.
Επίσης, θεωρούν ότι θα πρέπει να κάνει περισσότερα σύνθετα ερωτήματα από ό, τι ακριβώς τους φίλους των φίλων, για παράδειγμα, όταν θέλετε να φιλτράρει όλες τις θέσεις γύρω από ένα δεδομένο συντονίζουν ότι εσείς και οι φίλοι των φίλων σας αρέσει. Ένα γράφημα είναι η τέλεια λύση εδώ.
Δεν μπορώ να σας πω πώς να το φτιάξεις έτσι ώστε να έχουν καλές επιδόσεις, αλλά απαιτεί σαφώς κάποια δοκιμή και λάθος και συγκριτικής αξιολόγησης.
Εδώ είναι μου απογοητευτικό τεστ για λίγο τα ευρήματα τους φίλους των φίλων:
DB Schema:
CREATE TABLE IF NOT EXISTS `friends` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Φίλοι των Φίλων Ερώτημα:
(
select friend_id
from friends
where user_id = 1
) union (
select distinct ff.friend_id
from
friends f
join friends ff on ff.user_id = f.friend_id
where f.user_id = 1
)
Θα ήθελα να συστήσω πραγματικά να σας δημιουργήσει κάποια δεδομένα δείγματος με τουλάχιστον 10k αρχεία του χρήστη και το καθένα από αυτά έχει τουλάχιστον 250 συνδέσεις φίλο και, στη συνέχεια, εκτελέστε αυτό το ερώτημα. Στη μηχανή μου (i7 4770k, SSD, 16GB RAM), το αποτέλεσμα ήταν ~ 0,18 δευτερόλεπτα για το συγκεκριμένο ερώτημα. Ίσως μπορεί να βελτιστοποιηθεί, δεν είμαι μια ιδιοφυΐα DB (προτάσεις είναι ευπρόσδεκτες). Ωστόσο, αν αυτή η ζυγαριά γραμμική είστε ήδη σε 1,8 δευτερόλεπτα μόνο 100k χρήστες, 18 δευτερόλεπτα 1 εκατομμύριο χρήστες.
Αυτό μπορεί να εξακολουθεί να ακούγεται OKish για ~ 100k χρήστες, αλλά θεωρούν ότι το μόνο που παρατραβηγμένο οι φίλοι των φίλων και δεν κάνει πια σύνθετο ερώτημα όπως " εμφάνιση με μόνο δημοσιεύσεις από τους φίλους των φίλων + κάνει τον έλεγχο άδεια, αν μου επιτρέπεται ή δεν επιτρέπεται για να δείτε μερικά από αυτά + κάνετε μια υπο ερώτημα για να ελέγξετε αν μου άρεσε κάποια από αυτές ». Θέλετε να αφήσετε το DB κάνει τον έλεγχο για αν σας άρεσε μια θέση που έχουν ήδη ή όχι ή αν θα πρέπει να κάνετε στον κώδικα. Επίσης, θεωρούν ότι αυτό δεν είναι το μόνο ερώτημα που τρέχει και ότι σας έχει περισσότερες από ενεργοί χρήστες ταυτόχρονα σε μια περισσότερο ή λιγότερο δημοφιλές site.
Νομίζω ότι η απάντησή μου απαντά στο ερώτημα πώς Facebook σχεδιαστεί για τη σχέση τους φίλους τους πολύ καλά, αλλά λυπάμαι που δεν μπορώ να σας πω πώς να την εφαρμόσουν κατά τρόπο που θα λειτουργήσει γρήγορα. Η εφαρμογή ενός κοινωνικού δικτύου είναι εύκολο, αλλά φροντίζοντας να αποδίδει καλά, δεν είναι σαφές - IMHO.
Έχω αρχίσει να πειραματίζεται με OrientDB να κάνει το γράφημα-ερωτήματα και χαρτογράφηση άκρες μου με την υποκείμενη SQL DB. Αν ποτέ να το κάνει εγώ θα γράψω ένα άρθρο σχετικά με αυτό.