TL; DR :
이들은 스택의 MySQL 맨 위에있는 모든 것에 대해 캐시 된 그래프가있는 스택 아키텍처를 사용합니다.
긴 답변 :
나는 그들이 방대한 양의 데이터를 처리하고 빠른 방법으로 검색하는 방법이 궁금하기 때문에 이것에 대해 약간의 연구를했습니다. 사용자 기반이 커지면 맞춤형 소셜 네트워크 스크립트가 느려지는 것에 대해 불평하는 사람들이 있습니다. 그룹 권한과 좋아요 및 벽 게시물에 대해 신경 쓰지 않고 10k 명의 사용자와 250 만 명의 친구 연결로 벤치마킹 한 후이 접근법에 결함이 있음이 신속하게 밝혀졌습니다. 그래서 웹을 더 잘하는 방법에 대해 웹을 검색하는 데 시간을 보냈 으며이 공식 Facebook 기사를 보았습니다.
나는 정말 전에 계속 읽고 위의 첫 번째 링크의 프레젠테이션을보고 당신을 추천합니다. FB가 찾을 수있는 장면에서 어떻게 작동하는지에 대한 최고의 설명 일 것입니다.
비디오와 기사는 몇 가지 사항을 알려줍니다.
- 그들은 스택 맨 아래 에서 MySQL을 사용 하고 있습니다.
- SQL DB 위에는 적어도 두 가지 수준의 캐싱을 포함하고 연결을 설명하기 위해 그래프를 사용하는 TAO 계층이 있습니다.
- 캐시 된 그래프에 실제로 사용하는 소프트웨어 / DB에서 아무것도 찾을 수 없습니다.
이걸 보자. 친구 연결은 왼쪽 상단입니다.
글쎄, 이것은 그래프입니다. :) SQL로 작성 하는 방법 을 알려주지는 않지만 여러 가지 방법 이 있지만 이 사이트 에는 많은 다른 접근 방식이 있습니다. 주의 : 관계형 DB가 무엇인지 고려하십시오. 그래프 구조가 아니라 정규화 된 데이터를 저장하는 것으로 생각됩니다. 따라서 특수 그래프 데이터베이스만큼 성능이 좋지 않습니다.
또한 예를 들어 친구와 친구가 좋아하는 특정 좌표 주위의 모든 위치를 필터링하려는 경우 친구의 친구보다 복잡한 쿼리를 수행해야합니다. 그래프는 완벽한 솔루션입니다.
제대로 작동하도록 빌드하는 방법을 알 수는 없지만 시행 착오와 벤치마킹이 분명히 필요합니다.
여기 내입니다 실망 에 대한 시험 단지 친구의 결과 친구 :
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;
친구의 친구 쿼리 :
(
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 억 명의 사용자의 경우 이미 1.8 초, 백만 명의 사용자의 경우 18 초입니다.
~ 100k 명의 사용자에게는 여전히 괜찮은 것처럼 들릴 수 있지만 친구의 친구를 가져 왔으며 " 친구의 친구에게만 게시 한 게시물 표시 + 허용 여부에 대한 권한 확인 수행 "과 같이 더 복잡한 쿼리를 수행하지 않았다고 생각하십시오 그들 중 일부를보고 + 내가 그들 중 하나를 좋아하는지 확인하기 위해 하위 쿼리를 수행 ". 게시물이 이미 좋았는지 아닌지 또는 코드를 작성해야하는지 DB가 확인하도록하려고합니다. 또한이 쿼리 만이 실행되는 쿼리는 아니며 인기있는 사이트에서 동시에 활성 사용자보다 많은 사용자가 있다는 것을 고려하십시오.
내 대답은 Facebook이 친구 관계를 어떻게 잘 설계했는지에 대한 질문에 대한 답변이라고 생각하지만 빠른 작동 방식으로 구현하는 방법을 말할 수 없어서 죄송합니다. 소셜 네트워크를 구현하는 것은 쉽지만 제대로 작동하는지 확인하는 것은 분명하지 않습니다-IMHO.
그래프 쿼리를 수행하고 가장자리를 기본 SQL DB에 매핑하기 위해 OrientDB를 실험하기 시작했습니다. 내가 끝내면 그것에 관한 기사를 쓸 것입니다.