TL; DR:
De bruker en stabel arkitektur med bufrede grafer for alt over MySQL bunnen av deres stabelen.
Long Svar:
Jeg gjorde noen undersøkelser på dette selv fordi jeg var nysgjerrig på hvordan de håndtere sin enorme mengder data, og søke det på en rask måte. Jeg har sett folk klage på skreddersydde sosiale nettverk skript blir treg når brukerbasen vokser. Etter at jeg gjorde noen benchmarking meg selv med bare 10k brukere og 2,5 millioner venn tilkoblinger - ikke engang prøver å bry seg om grupperettigheter og liker og veggen innlegg - det raskt viste seg at denne tilnærmingen er feil. Så jeg har brukt litt tid på å søke på nettet om hvordan du gjør det bedre, og kom over denne offisielle Facebook-artikkel:
Jeg virkelig anbefale deg å se presentasjonen av den første linken over før fortsette å lese. Det er sannsynligvis den beste forklaringen på hvordan FB fungerer bak kulissene du kan finne.
Videoen og artikkelen forteller deg et par ting:
- De bruker MySQL helt på bunnen av sin stabel
- Ovenfor SQL-DB er den TAO lag som inneholder i det minste to nivåer av bufring og er ved hjelp av grafer for å beskrive forbindelsene.
- Jeg kunne ikke finne noe på hvilken programvare / DB de faktisk bruker for sine bufrede grafer
La oss ta en titt på denne, venn tilkoblinger er øverst til venstre:

Vel, dette er en graf. :) Det trenger ikke fortelle deg hvordan å bygge den i SQL, er det flere måter å gjøre det, men dette området har en god mengde ulike tilnærminger. OBS: Tenk at en relasjons DB er hva det er: Det er tenkt å lagre normalisert data, ikke en graf struktur. Så det vil ikke utføre like bra som en spesialisert grafdatabase.
Tenk også på at du trenger å gjøre mer komplekse spørringer enn bare venner av venner, for eksempel hvis du ønsker å filtrere alle steder rundt et gitt koordinat at du og dine venners venner som. En graf er den perfekte løsningen her.
Jeg kan ikke fortelle deg hvordan du kan bygge det slik at det vil gi gode resultater, men det klart krever litt prøving og feiling og benchmarking.
Her er min skuffende test for bare funn venner av venner:
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;
Venner av venner Kriterier:
(
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
)
Jeg virkelig anbefale deg å lage deg noen eksempler på data med minst 10k brukerposter, og hver av dem har minst 250 venneforbindelser og deretter kjøre denne spørringen. På min maskin (i7 4770k, SSD, 16GB RAM) var resultatet ~ 0,18 sekunder for det aktuelle søket. Kanskje det kan optimaliseres, jeg er ikke en DB geni (forslag er velkomne). Men hvis dette skalerer lineært du allerede er på 1,8 sekunder for bare 100k brukere, 18 sekunder for 1 million brukere.
Dette kan fortsatt høres OKish for ~ 100k brukere, men mener at du bare hentet venner av venner og ikke gjøre noe mer kompleks spørring som " vise meg kun innlegg fra venners venner + gjøre tillatelse sjekke om jeg er tillatt eller ikke å se noen av dem + gjøre en sub spørring for å sjekke om jeg likte noen av dem ". Du ønsker å la DB gjøre sjekken på hvis du likte en post allerede eller ikke, eller du må gjøre i kode. Tenk også på at dette ikke er den eneste spørringen du kjører, og at din har mer enn aktiv bruker på samme tid på en mer eller mindre populære nettstedet.
Jeg tror mitt svar besvarer spørsmålet hvordan Facebook designet deres venner forholdet veldig bra, men jeg beklager at jeg ikke kan fortelle deg hvordan du kan implementere det på en måte det vil fungere raskt. Implementering av et sosialt nettverk er lett, men å sørge for at det fungerer godt er åpenbart ikke - IMHO.
Jeg har begynt å eksperimentere med OrientDB å gjøre diagram-spørringer og kartlegge mine kanter til den underliggende SQL DB. Hvis jeg noen gang får det gjort Jeg skal skrive en artikkel om det.