소셜 네트워킹 웹 사이트는 친구 업데이트를 어떻게 계산합니까?

StackOverflow https://stackoverflow.com/questions/762490

  •  11-09-2019
  •  | 
  •  

문제

소셜 네트워킹 웹 사이트는 아마도 사용자, 친구 및 이벤트를위한 테이블을 유지할 것입니다 ...

이 테이블을 사용하여 효율적이고 확장 가능한 방식으로 친구 이벤트를 계산하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

Twitter와 같은 많은 소셜 네트워킹 사이트는 메시지 대기열 응용 프로그램을 제외하고 RDBMS를 전혀 사용하지 않습니다. 그들 중 많은 사람들이 Rabbitmq와 같은 이미 현재 현재의 응용 프로그램으로 시작합니다. 그들 중 일부는 충분히 커져서 자신을 많이 사용자 정의하거나 구축해야합니다. 트위터는 두 번째 로이 작업을 수행하고 있습니다.

메시지 큐 애플리케이션은 하나 이상의 다른 서비스에 대해 하나의 서비스에서 메시지를 보관하여 작동합니다. 예를 들어 Service Frank가 큐에 메시지를 게시하고 있다고 말합니다. Joe와 Jill은 Franks Foo 대기열에 가입되었습니다. 응용 프로그램은 Joe 또는 Jill이 메시지를 받았는지 여부를 추적 할 것입니다. 일단 큐의 구독자가 한 번 큐를 버렸습니다. 프랭크는 메시지를 해고하고 잊어 버립니다. Joe와 Jill은 Foo의 메시지를 요청하고 아직 얻지 못한 메시지를 얻습니다. Joe와 Jill은 메시지와 관련하여 필요한 모든 일을합니다. 아마도 그것을 보관할 것입니다.

메시지 큐 애플리케이션은 메시지를받는 모든 사람이 메시지를 요청할 때 메시지를받을 수 있고받을 수 있다고 보장합니다. 게시자는 가입자가 결국받을 수 있다고 확신하는 메시지를 보낼 수 있습니다. 이는 완전히 비동기식이되고 비용이 많이 드는 조인이 필요하지 않다는 이점이 있습니다.

편집 : 나는 또한 일반적으로 이런 종류의 물건에 대한 스토리지가 대규모로 무너지고 있음을 언급해야합니다. 따라서 Joe와 Jill은 똑같은 메시지의 사본을 저장하고있을 수 있습니다. 응용 프로그램이 수십억 명의 사용자에게 스케일을 돕기 때문에 괜찮은 것으로 간주됩니다.

기타 독서 :

  1. http://www.rabbitmq.com/
  2. http://qpid.apache.org/

다른 팁

소셜 네트워킹 사이트의 메인 스테이 데이터 구조는 다음과 같습니다. 그래프. Facebook에서 그래프는 방향을 밝히지 않습니다 (누군가의 친구 일 때는 친구입니다). 트위터에서 그래프가 지시됩니다 (누군가를 따르지만 반드시 당신을 따르는 것은 아닙니다).

그래프를 표현하는 두 가지 인기있는 방법은입니다 인접력 목록 그리고 인접 행렬.

인접력 목록은 단순히 그래프의 가장자리 목록입니다. 정수 userID를 가진 사용자를 고려하십시오.

User1, User2
  1      2
  1      3
  2      3

이러한 레코드에 대한 무의미한 해석은 사용자 1이 사용자 2 및 3과 친구이고 사용자 2는 사용자 3과 친구라는 것입니다.

데이터베이스 테이블에서 이것을 나타내는 것은 사소한 일입니다. 우리가 익숙한 것은 많은 관계 가입 테이블입니다. 특정 사용자의 친구를 찾기위한 SQL 쿼리는 작성하기가 매우 쉽습니다.

이제 특정 사용자의 친구를 알았으므로 해당 결과를 업데이트 테이블에 가입하면됩니다. 이 테이블에는 사용자 ID로 색인 된 모든 사용자 업데이트가 포함되어 있습니다.

이 모든 테이블이 올바르게 색인화되는 한, 관심있는 질문에 답하기 위해 효율적인 쿼리를 설계하는 데 매우 쉬운 시간이 있습니다.

Travis는 이것에 대한 훌륭한 게시물을 썼습니다.

활동 기록과 친구는 Rails & Pfeed를 먹습니다

소규모 규모의 경우 user.friends and users.events 및 쿼리 캐싱에 가입하는 것은 아마도 괜찮지 만 친구와 이벤트가 커짐에 따라 매우 빠르게 느려집니다. 또한 사용자가 이벤트를 만들 때마다 이벤트 기반 모델을 시도 할 수도 있습니다. 따라서 사용자가 친구가 만든 이벤트를보고 싶을 때마다 단순히 자신의 ID와 Friends_events 테이블 사이에 가입하고 알아낼 수 있습니다. 이런 식으로 당신은 모든 사용자를 친구와 함께 잡고 이벤트 테이블과 친구들과 함께하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top