TL; DR:
Họ sử dụng một kiến trúc ngăn xếp với các biểu đồ được lưu trong bộ nhớ cache cho mọi thứ phía trên đáy của ngăn xếp của họ.
Câu trả lời dài:
Tôi đã thực hiện một số nghiên cứu về điều này bởi vì tôi tò mò về cách họ xử lý lượng dữ liệu khổng lồ của họ và tìm kiếm nó một cách nhanh chóng. Tôi đã thấy mọi người phàn nàn về các tập lệnh mạng xã hội tùy chỉnh trở nên chậm chạp khi cơ sở người dùng phát triển. Sau khi tôi thực hiện một số điểm chuẩn cho bản thân chỉ với 10 nghìn người dùng và 2,5 triệu kết nối bạn bè - thậm chí không cố gắng bận tâm về quyền và nhóm thích và bài đăng trên tường - nó nhanh chóng nhận ra rằng phương pháp này là thiếu sót. Vì vậy, tôi đã dành thời gian tìm kiếm trên web về cách làm nó tốt hơn và tìm thấy bài viết chính thức này của Facebook:
Tôi thực sự khuyên bạn nên xem phần trình bày của liên kết đầu tiên ở trên trước khi tiếp tục đọc. Đây có lẽ là lời giải thích tốt nhất về cách FB hoạt động đằng sau hậu trường bạn có thể tìm thấy.
Video và bài viết cho bạn biết một số điều:
- Họ đang sử dụng MySQL ở cuối ngăn xếp của họ
- Phía trên SQL DB có lớp TAO chứa ít nhất hai cấp bộ đệm và đang sử dụng biểu đồ để mô tả các kết nối.
- Tôi không thể tìm thấy bất cứ điều gì trên phần mềm / DB mà họ thực sự sử dụng cho các biểu đồ được lưu trong bộ nhớ cache của họ
Chúng ta hãy xem điều này, các kết nối bạn bè ở trên cùng bên trái:
Vâng, đây là một biểu đồ. :) Nó không cho bạn biết cách xây dựng nó trong SQL, có một số cách để làm điều đó nhưng trang web này có một số cách tiếp cận khác nhau. Chú ý: Hãy xem xét rằng một DB quan hệ chính là nó: Nó được cho là lưu trữ dữ liệu chuẩn hóa, không phải là một cấu trúc biểu đồ. Vì vậy, nó sẽ không hoạt động tốt như một cơ sở dữ liệu đồ thị chuyên dụng.
Cũng xem xét rằng bạn phải thực hiện các truy vấn phức tạp hơn chỉ là bạn bè của bạn bè, ví dụ như khi bạn muốn lọc tất cả các vị trí xung quanh tọa độ đã cho mà bạn và bạn bè của bạn thích. Một đồ thị là giải pháp hoàn hảo ở đây.
Tôi không thể cho bạn biết cách xây dựng nó để nó hoạt động tốt nhưng rõ ràng nó đòi hỏi một số thử nghiệm và lỗi và điểm chuẩn.
Đây là tôi thất vọng thử nghiệm cho chỉ phát hiện bạn của bạn bè:
Lược đồ 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;
Truy vấn bạn bè:
(
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
)
Tôi thực sự khuyên bạn nên tạo cho bạn một số dữ liệu mẫu có ít nhất 10 nghìn hồ sơ người dùng và mỗi người trong số họ có ít nhất 250 kết nối bạn bè và sau đó chạy truy vấn này. Trên máy của tôi (i7 4770k, SSD, RAM 16gb) kết quả là ~ 0,18 giây cho truy vấn đó. Có lẽ nó có thể được tối ưu hóa, tôi không phải là thiên tài DB (đề xuất được chào đón). Tuy nhiên, nếu tỷ lệ này tuyến tính, bạn đã ở mức 1,8 giây cho chỉ 100 nghìn người dùng, 18 giây cho 1 triệu người dùng.
Điều này có thể vẫn nghe có vẻ ổn đối với ~ 100 nghìn người dùng nhưng hãy cân nhắc rằng bạn chỉ tìm nạp bạn bè của bạn bè và không thực hiện bất kỳ truy vấn phức tạp nào như "chỉ hiển thị cho tôi các bài đăng từ bạn bè của bạn + kiểm tra quyền nếu tôi được phép hoặc KHÔNG được phép để xem một số trong số họ + thực hiện một truy vấn phụ để kiểm tra xem tôi có thích ai trong số họ không ". Bạn muốn để DB thực hiện kiểm tra xem bạn có thích một bài đăng hay không hoặc bạn sẽ phải làm bằng mã. Cũng xem xét rằng đây không phải là truy vấn duy nhất bạn chạy và bạn có nhiều hơn người dùng hoạt động cùng một lúc trên một trang web phổ biến hơn hoặc ít hơn.
Tôi nghĩ rằng câu trả lời của tôi trả lời câu hỏi làm thế nào Facebook thiết kế mối quan hệ bạn bè của họ rất tốt nhưng tôi xin lỗi vì tôi không thể cho bạn biết cách triển khai nó theo cách nó sẽ hoạt động nhanh. Việc triển khai một mạng xã hội là dễ dàng nhưng đảm bảo rằng nó hoạt động tốt rõ ràng là không - IMHO.
Tôi đã bắt đầu thử nghiệm với OrientDB để thực hiện các truy vấn biểu đồ và ánh xạ các cạnh của tôi tới SQL DB bên dưới. Nếu tôi hoàn thành nó tôi sẽ viết một bài báo về nó.