TL; DR:
Mereka menggunakan arsitektur tumpukan dengan grafik yang di-cache untuk semua yang ada di atas bagian bawah tumpukan MySQL mereka.
Jawaban panjang:
Saya melakukan riset sendiri karena saya ingin tahu bagaimana mereka menangani data dalam jumlah besar dan mencarinya dengan cepat. Saya telah melihat orang-orang mengeluh tentang skrip jejaring sosial yang dibuat khusus menjadi lambat ketika basis pengguna bertambah. Setelah saya melakukan benchmark sendiri dengan hanya 10k pengguna dan 2,5 juta koneksi teman - bahkan tidak mencoba untuk peduli tentang izin grup dan suka dan posting dinding - dengan cepat ternyata pendekatan ini cacat. Jadi saya telah menghabiskan waktu mencari di web tentang cara melakukannya dengan lebih baik dan menemukan artikel resmi Facebook ini:
Saya sangat merekomendasikan Anda untuk menonton presentasi tautan pertama di atas sebelum melanjutkan membaca. Itu mungkin penjelasan terbaik tentang cara kerja FB di balik layar yang dapat Anda temukan.
Video dan artikel memberi tahu Anda beberapa hal:
- Mereka menggunakan MySQL di bagian paling bawah tumpukan mereka
- Di atas SQL DB ada lapisan TAO yang berisi setidaknya dua level caching dan menggunakan grafik untuk menggambarkan koneksi.
- Saya tidak dapat menemukan apa pun pada perangkat lunak / DB apa yang sebenarnya mereka gunakan untuk grafik cache mereka
Mari kita lihat ini, koneksi teman di kiri atas:
Ini adalah grafik. :) Ini tidak memberi tahu Anda bagaimana membangunnya dalam SQL, ada beberapa cara untuk melakukannya tetapi situs ini memiliki sejumlah pendekatan yang berbeda. Perhatian: Pertimbangkan bahwa DB relasional adalah apa adanya: Diperkirakan untuk menyimpan data yang dinormalisasi, bukan struktur grafik. Jadi itu tidak akan berfungsi sebaik basis data grafik khusus.
Juga pertimbangkan bahwa Anda harus melakukan kueri yang lebih kompleks daripada sekadar teman teman, misalnya ketika Anda ingin memfilter semua lokasi di sekitar koordinat yang Anda dan teman teman Anda sukai. Grafik adalah solusi sempurna di sini.
Saya tidak bisa memberi tahu Anda cara membuatnya sehingga kinerjanya baik tetapi jelas membutuhkan beberapa percobaan dan kesalahan serta pembandingan.
Inilah tes mengecewakan saya untuk adil temuan teman teman:
Skema DB:
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;
Pertanyaan Teman dari Friends:
(
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
)
Saya benar-benar menyarankan Anda untuk membuat Anda beberapa data sampel dengan setidaknya 10k catatan pengguna dan masing-masing dari mereka memiliki setidaknya 250 koneksi teman dan kemudian jalankan kueri ini. Di mesin saya (i7 4770k, SSD, 16gb RAM) hasilnya adalah ~ 0,18 detik untuk permintaan itu. Mungkin itu bisa dioptimalkan, saya bukan jenius DB (saran dipersilahkan). Namun, jika skala ini linier, Anda sudah berada di 1,8 detik hanya untuk 100 ribu pengguna, 18 detik untuk 1 juta pengguna.
Ini mungkin masih terdengar OK untuk ~ 100k pengguna tetapi pertimbangkan bahwa Anda baru saja menjemput teman teman dan tidak melakukan kueri yang lebih rumit seperti " tampilkan saya hanya posting dari teman teman + lakukan pemeriksaan izin jika saya diizinkan atau TIDAK diizinkan untuk melihat beberapa dari mereka + melakukan sub kueri untuk memeriksa apakah saya menyukai salah satu dari mereka ". Anda ingin membiarkan DB melakukan pemeriksaan apakah Anda sudah menyukai pos atau tidak atau Anda harus melakukannya dalam kode. Juga pertimbangkan bahwa ini bukan satu-satunya kueri yang Anda jalankan dan bahwa Anda memiliki lebih dari pengguna aktif pada saat yang sama di situs yang kurang lebih populer.
Saya pikir jawaban saya menjawab pertanyaan bagaimana Facebook merancang hubungan teman-teman mereka dengan sangat baik, tetapi saya minta maaf karena saya tidak bisa memberi tahu Anda bagaimana menerapkannya dengan cara yang akan bekerja cepat. Menerapkan jaringan sosial itu mudah tetapi memastikan kinerjanya baik jelas tidak - IMHO.
Saya sudah mulai bereksperimen dengan OrientDB untuk melakukan query grafik dan memetakan tepi saya ke SQL DB yang mendasarinya. Jika saya menyelesaikannya, saya akan menulis artikel tentang itu.