문제

방금 재밌는거 봤다 "트위터의 흥망성쇠" 나는 다음과 같은 생각을 하게 되었습니다.

트위터를 다시 구현한다면 무엇을 다르게 하시겠습니까?

어떤 기술을 사용하시겠습니까?어떤 언어?

서비스의 확장성을 어떻게 보장하나요?

또 무엇을 바꾸시겠습니까?

도움이 되었습니까?

해결책

다음과 같이 GAE에 구현했을 것입니다.

각 사용자는 자신이 팔로우하는 사람들의 트윗이 포함된 테이블을 갖게 됩니다.이 테이블의 키는 (사용자, 타임스탬프 내림차순)으로 지정됩니다.

각 사용자에게는 사용자를 연속적인 팔로어 ID 범위 집합에 매핑하는 follower_ranges 테이블도 있습니다.팔로어가 수천 명에 불과한 대부분의 사용자의 경우 이 테이블에는 단일 항목(-inf..+inf)이 있습니다.이것이 묵시적인 기본값이 됩니다.팔로어가 더 많은 사용자의 경우 테이블의 각 범위에는 수천 명의 사용자가 있습니다.범위는 일정 간격 내에서 각 사용자 수를 유지하기 위해 시간이 지남에 따라 균형을 이룹니다.1000보다 크고 10000보다 작습니다.모든 범위의 통합에는 모든 사용자 ID가 포함됩니다.

사용자 -> 팔로어 작업이 생성될 때마다 작업으로 인코딩되어 대기열에 추가됩니다.대기열의 각 요소는 (발신자, 작업, 페이로드, 추종자 하위 범위) 튜플입니다.대기열 작업자는 항목을 가져와 지정된 하위 범위에서 모든 팔로어를 찾아 각 항목에 작업을 적용합니다.(작업은 "트윗 추가", "트윗 삭제", "트윗 편집" 등이 될 수 있습니다.기본적으로 모든 추종자에게 적용되어야 하는 모든 것입니다.)

각 팔로어에 대기열 작업을 적용하면 각 사용자의 트윗 테이블에 해당하는 쓰기 및 삭제 작업이 수행됩니다.대기열의 장벽은 쓰기가 즉시 나타나지 않음을 의미하지만 지연을 몇 초 미만으로 유지하는 것이 가능해야 합니다.

사용자에게 자신의 트윗을 보여주는 것은 저렴한 작업입니다."SELECT * FROM 트윗 WHERE user_id = :user_id ORDER BY (created_at DESC) LIMIT :max_per_page".이는 단일 테이블을 스캔하며 매우 빠른 작업입니다.(사용자 차단 대기 시간을 낮게 유지하는 것이 좋습니다!)

나는 이 디자인이 처음에는 꽤 잘 확장될 것이라고 생각합니다.이제 시스템의 각 구성 요소를 쉽게 확장할 수 있습니다.

  • 대기열 저장소는 GAE로 지원되며 데이터 저장소 테이블에 따라 확장될 수 있습니다.
  • 프런트엔드의 크기는 자연스럽게 조정될 수 있으며 끈적임이 필요하지 않습니다.
  • 언제든지 더 많은 대기열 프로세서를 추가할 수 있습니다.
  • 실제 스토리지 테이블은 자연스럽게 커지며 Datastore에서 적절하게 확장됩니다.

즉, 즉시 살펴볼 몇 가지 향후 개선 사항을 생각해 볼 수 있습니다.

  • 거의 표시되지 않는 데이터의 저장 공간을 줄입니다.이 디자인은 각 트윗을 팔로워별 복사본으로 비정규화합니다.그러나 일반적으로 가장 최근 트윗에만 액세스됩니다.N일이 지난 트윗의 사용자별 복사본을 삭제하면 많은 저장 공간을 복구할 수 있습니다.사용자가 고대 역사의 내용을 보려고 하면 비정규화된 테이블에서 데이터를 가져옵니다.이는 속도는 느리지만 너무 자주 발생하지는 않으며 비용 절감 효과도 상당할 것입니다.저장 공간 절약:(#avg_followers - 1) / #avg_followers
  • 쓰기 패턴이 최적이 아닙니다.여러 대기열 항목에 걸쳐 각 대기열 작업자는 모든 사용자의 트윗 테이블에 기록하므로 쓰기 집약성은 그다지 좋지 않습니다.(최악의 경우 #processor * #storage 서버 연결이 발생합니다.) 이는 각 사용자 범위에 여러 업데이트를 적용하여 해결할 수 있습니다.예를 들어, 두 작업 A와 B가 범위 [0, 10000)에 적용되는 경우 단일 대기열 프로세서가 이 두 작업을 한 번에 적용하도록 합니다.

다른 팁

이미 완료되고 있습니다. 라코니카

  1. 이미 2부 - 복수가 진행 중입니다. identi.ca (Laconica의 꼭대기에 있습니다)
  2. 이미 완료되고 있는 파트 III - 다크 사이드에서: 불평

VBG!(-:

다시 돌아가서 다시 해보자는 전제에서 시작하겠습니다.내가 뭘 다르게 할 수 있을까? 그때 내가 트위터에 있었나?

별거 아닙니다.

트위터는 중요한 사항에 초점을 맞추었습니다.사람들이 실제로 서비스를 제공하는 것 원하다 사용.

나는 짧은 기간에 큰 인기를 끌면서 가장 큰 위협이 확장성을 갖게 된 제품에 대한 작업을 하고 싶습니다.즉, 당신이 이겼다는 뜻입니다.성공과 함께 성공을 활용하기 위한 자원과 관심도 필요합니다.

나는 처음부터 확장 가능하도록 디자인할 것이다.

내 선택은 Microsoft Platform, C#, IIS, SQL Server, Memcached(또는 Velocity가 최종 버전이고 시작할 때 잘 실행되는 경우 ;-)입니다.

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