http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html 여기 있는 글을 정리한 수준.
target TPS, read: 1000 tps write: 100 tps
data model
- user
- id
- name
- tweet
- id
- content
- created
- type: retweet|reply|
- follower N:M mapping
- 이것은 Flock이라는 Graph DB를 사용했다고 함. following, follower, block 등의 정보 저장.
- uid
- follow_uid
arch
- db는 nosql(Dynamo DB, mongo DB)를 쓰거나, mysql을 sharding해서.. sharding은 timestamp로 샤딩.
- 트위터는 write보다는 read요청이 훨씬 많으니 read에 최적화를 해야 함.
- 대량의 redis cluster로 timeline을 캐쉬해 둔다.
- 사용자가 트윗을 올리면, follower의 redis cache로 push해 준다. follwer가 많은 유명인의 경우 상당한 시간이 걸릴수 있다. 레이디 가가나 오바마 같은 경우
- home timeline의 트윗은 최대 800개까지 redis에 저장
ranking
- 기본적으로는 시간순으로 타임 라인을 구성할 수 있다.
- 여기에 커멘트가 많거나 공유가 많은 트윗에 가산점을 줘서 점수로 소트하여 타임라인에 표시해 줄 수 있다
- affinity, time, popularity의 팩터가 중요
- 이러한 인풋대비 결과(stickyness)와 연동하여 A/B test후 계속 개선해 나가야 함. 이를 위해서는 analytics 역시 필요.
Publishing
- pull vs push, read가 훨씬 많기 때문에 write시에 push해서 미리 사용자들의 타임라인을 만들어 두는 것이 유리
- inactive 사용자나 트위터 홈, 서치 결과(query timeline)등은 pull based로 하고 있음.