TL; DR:
Zij maken gebruik van een stapel architectuur met in de cache grafieken voor alles boven de MySQL bodem van hun stack.
Lang antwoord:
Ik deed wat onderzoek op deze mezelf, want ik was benieuwd hoe ze hun enorme hoeveelheid gegevens te verwerken en zoek het op een snelle manier. Ik heb gezien dat mensen klagen over custom made social network scripts steeds traag als het aantal gebruikers groeit. Nadat ik deed wat benchmarking mijzelf met slechts 10k gebruikers en 2,5 miljoen vriend verbindingen - zelfs niet proberen te bekommeren over groepsrechten en voorkeuren en wall posts - het snel bleek dat deze aanpak is gebrekkig. Dus ik heb enige tijd zoeken op het web over hoe het beter te doen en kwam over dit officiële Facebook-artikel:
Ik echt raden u aan de presentatie van de eerste link hierboven voor lees verder kijken. Het is waarschijnlijk de beste uitleg over hoe FB werkt achter de schermen u kunt vinden.
De video- en artikel vertelt u een paar dingen:
- Ze gebruiken MySQL aan de zeer bodem van hun stack
- Boven de SQL DB is de BTB laag die ten minste twee niveaus van caching bevat grafieken en gebruikt om de verbindingen te beschrijven.
- Ik kon niets over welke software / DB ze daadwerkelijk gebruiken voor hun gecachte grafieken vinden
Laten we eens een kijkje op deze, vrienden connecties zijn linksboven:

Nou, dit is een grafiek. :) Het maakt je niet vertellen hoe het te bouwen in SQL, zijn er verschillende manieren om het te doen, maar deze site heeft een goed bedrag van de verschillende benaderingen. Opgelet: Bedenk dat een relationele database is wat het is: Men denkt aan het genormaliseerde data, niet een grafische structuur op te slaan. Dus het zal niet zo goed presteren als een gespecialiseerde grafiek database.
Ook van mening dat je meer complexe queries dan alleen vrienden van vrienden, bijvoorbeeld doen als u alle locaties te filteren rond een bepaalde coördinaat die u en uw vrienden van vrienden wilt. Een grafiek is de perfecte oplossing.
Ik kan je niet vertellen hoe het te bouwen zodat het goed zal presteren, maar het vereist duidelijk wat trial and error en benchmarking.
Hier is mijn teleurstellend test voor slechts bevindingen vrienden van vrienden:
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;
Friends of Friends Query:
(
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
)
Ik raad u om u enkele voorbeelden van gegevens te maken met ten minste 10k gebruikersrecords en elk van hen hebben ten minste 250 vrienden connecties en voer deze vraag. Op mijn machine (i7 4770k, SSD, 16 GB RAM) was het resultaat ~ 0.18 seconden voor die zoekopdracht. Misschien kan worden geoptimaliseerd, ik ben niet een DB genie (suggesties zijn welkom). Echter, als deze schalen lineair je bent al bij 1,8 seconden voor slechts 100k gebruikers, 18 seconden gedurende 1 miljoen gebruikers.
Dit kan nog steeds klinken OKish voor ~ 100k gebruikers, maar zijn van mening dat je gewoon opgehaald vrienden van vrienden en deden niet meer complexe query als " weer te geven me alleen berichten van vrienden van vrienden + do toestemming controleer ik of ik wel of niet toegestaan om een aantal van hen te zien + doen een sub-query om te controleren of ik vond een van hen ." U wilt laten de DB doen de controle op als je een post vond al of niet of je moet doen in de code. Ook van mening dat dit niet de enige vraag je rennen en dat je meer dan actieve gebruiker op hetzelfde moment op een min of meer populaire site.
Ik denk dat mijn antwoord geeft antwoord op de vraag hoe Facebook ontwierpen hun vrienden relatie heel goed maar het spijt me dat ik je niet kan vertellen hoe het te implementeren op een manier die zal snel werken. Het implementeren van een sociaal netwerk is eenvoudig, maar zorg ervoor dat het goed presteert is duidelijk niet - IMHO.
Ik ben begonnen te experimenteren met OrientDB om de grafiek-queries te doen en in kaart brengen van mijn randen om de onderliggende SQL DB. Als ik ooit het gedaan te krijgen zal ik een artikel over te schrijven.