본문 바로가기

server/system design

3. twitter

1. 기능 요구 사항

  • 글 쓰기
  • 타임라인 확인
  • 트렌드 및 해시태그 리스트
  • 검색

 

2. 추정 및 제약 사항

  • 쓰기에 비해 읽기가 많다
  • 최종 일관성을 유지해야 한다. 사용자가 팔로워의 트윗을 약간 늦추어도 괜찮다
  • 트윗은 140 자로 제한

 

3. 데이터베이스 설계

Redis && DB

기능 요구 사항에 따른 필요 테이블들

  • user
  • tweet
  • follwer

DB 테이블 관계도

필요 쿼리들

  1. get follwers
  2. get latest tweets

Twitter 서비스의 기본 아키텍처는 User , Tweet , Followers로 구성된다.

  • 사용자 정보는 사용자 테이블에 저장된다
  • 사용자가 트윗하면 사용자 ID와 함께 tweet 테이블에 저장된다
  • 사용자 테이블은 tweet 테이블과 일대 다 관계를 갖는다.
  • 사용자가 다른 사용자를 팔로우하면 Followers Table에 저장되고 Redis도 캐시 한다.

캐시를 위한 Rredis의 키 저장 방법 예시

Redis : <user_id>-tweets : [1, 2, 3, 4,.....]

<user_id>-follower: [1, 2, 3, 4.....] <tweet_id>-tweet: " hello? "

 

 

4. 타임라인 설계

  • 특정 사용자에 대한 글로벌 tweet 테이블 / Redis에서 모든 tweet을 가져온다.
  • 리트윗도 포함되며, 원래 트윗 참조와 함께 트윗으로 리트윗 저장
  • 사용자 타임 라인에 표시, 날짜순으로 정렬

 

5. 일반 유저의 트윗 전달

일반 유저의 메시지를 작성한 경우 다음과 같은 흐름으로 작동한다.

  1. 작성한 메시지는 DB에 저장된다.
  2. 자신의 타임라인에 기록된다. (Redis) 바로 갱신함
  3. 팔로워들의 타임라인에 기록된다. (Redis) 바로 갱신함

 

간단한 트윗의 흐름

  • 사용자 A 트윗
  • Load Balancer를 통해 트윗이 백엔드 서버로 전송된다.
  • 서버는 DB / redis에 트윗을 저장한다
  • 서버는 캐시에서 사용자 A를 따르는 모든 사용자를 가져온다
  • 서버 노드는 이 트윗을 팔로워의 redis 내 타임 라인에 저장한다
  • 결국 사용자 A의 모든 팔로워는 타임 라인에서 사용자 A의 트윗을 보게 된다

 

 

 

유명인의 경우 수많은 팔로워들에게 메시지를 전달해야 한다. 이는 기존의 캐시 방식으로 활용할 수 없어 다른 방법으로 해결해야 한다.

수천만의 팔로워를 가진 유명인의 경우 (fanout ← 트위터에서 명칭 한 시스템 이름)

수천만의 redis 메모리를 바로 작업할 수가 없다. 메모리 부족 문제와 함께 누군가는 지연 현상이 있기 때문이다.

  1. 유명인들만의 메시지를 담은 Redis서버가 있고
  2. 유명인이 메시지를 작성하면 1번의 redis서버로 저장된다.
  3. 나의 타임라인 갱신 시 1번의 redis서버에 내가 팔로우하고 있는 유명인의 메시지가 있는지 확인하고
  4. 나의 타임라인을 업데이트해준다. 바로 갱신하지 않음

유명인의 트윗 흐름

  • 유명인 트윗을 제외한 모든 사람과 함께 사용자 A의 사전 계산된 홈 타임 라인
  • 사용자 A가 타임 라인에 액세스 하면 그의 트윗 피드가 로드 시간에 유명인 트윗과 병합된다.
  • 모든 사용자는 유명인 목록을 매핑하고 요청이 도착하면 런타임에 트윗을 혼합하고 캐시 한다.

15 일 이상 시스템에 로그인하지 않은 비활성 사용자에 대해서는 타임 라인을 계산하지 않는다!!! (실제로 이렇게 작동한다)


 

6. 트렌드 및 hashtag 반영

  • 카프카 스트림을 사용한다.
  1. 트윗의 특정 단어 및 해시태그를 필터링/파싱 한다.
  2. 트윗의 지역 정보가 있을 경우 redis 서버에 저장한다
  3. 트윗의 특정 단어와 해시태그를 카운팅 하여 랭킹 서버에 반영한다.
  4. 사용자는 API로 redis에 정보를 요청한다.

 

 

7. search (early bird)

full text 검색이 가능한 DB 사용 ( elasticsearch )

  1. 트윗의 단어별로 필터링한다.
  2. 기존 elasticsearch에 저장된 단어에 트윗의 id를 저장한다.

많이 검색되는 단어들은 redis 서버에 저장한다.



트위터에서 밝힌 실제 시스템 흐름도

 

 

참조

https://www.youtube.com/watch?v=wYk0xPP_P_8&ab_channel=TechDummiesNarendraL

https://www.youtube.com/watch?v=J5auCY4ajK8&ab_channel=Parleys

https://blog.pankajtanwar.in/how-twitter-stores-500m-tweets-a-day-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'server > system design' 카테고리의 다른 글

5. dropbox // google drive  (0) 2021.07.30
4. instagram // Flickr // Picasa  (0) 2021.07.23
2. pastebin ( text storage site )  (0) 2021.07.17
1. TinyURL // bitly (URL shortening service)  (0) 2021.07.09
how to system desgin?  (0) 2021.07.07