Skip to main content

11장. 뉴스 피드 시스템 설계

  • 페이스북의 업데이트와 같은 설계 문제가 있습니다.

1단계 문제 이해 및 설계 범위 확정#

  • 대상 : 모바일, 웹
  • 중요한 기능
    • 뉴스 피드 페이지에서 새로운 스토리를 올릴 수 있어야하며, 친구들이 올리는 스토리를 볼 수도 있음
  • 뉴스 피드의 순서
    • 시간 흐름 역순
  • 한명은 최대 5000명의 친구 가능
  • 트래픽은 대략 매일 천만명
  • 스토리에는 이미지나 비디오 등의 미디어 파일도 포함 가능

2단계 개략적 설계안 제시 및 동의 구하기#

  • 설계는 피드 발행과 뉴스 피드 생성의 두 가지 부분으로 나뉘어 있습니다.
    • 피드 발행: 사용자가 스토리를 포스팅하면 해당 데이터를 캐시와 데이터베이스에 기록합니다.
    • 뉴스 피드 생성: 지면 관계상 뉴스 피드는 모든 친구의 포스팅을 시간 흐름 역순으로 모아서 만든다고 가정합니다.

뉴스 피드 API#

  • 뉴스 피드 API는 클라이언트가 서버와 통신하기 위해 사용하는 수단입니다.
    • HTTP 프로토콜 기반입니다.
    • 피드 API와 피드 읽기 API로 나눌 수 있습니다.

피드 발행#

피드 발행

피드 생성#

피드 생성


3단계 상세 설계#

피드 발행 흐름 상세 설계#

웹 서버#

  • 웹 서버는 클라이언트와 통신할 뿐 아니라 인증이나 처리율 제한 등의 기능도 수행합니다.

포스팅 전송(팬아웃) 서비스#

  • 포스틍 전송, 즉 팬아웃은 어떤 사용자의 새 포스팅을 그 사용자와 친구 관계에 있는 모든 사용자에게 전달하는 과정입니다.
  • 하나는 쓰기 시점에 팬아웃하는 모델이고 하나는 읽기 시점에 팬아웃 하는 모델이 있습니다.

쓰기 시점에 팬아웃하는 모델#

  • 새로운 포스팅을 기록하는 시저멩 뉴스 피드를 갱신하게 됩니다.
  • 장점
    • 뉴스 피드가 실시간으로 갱신되면 친구 목록에 있는 사용자에게 즉시 전송됩니다.
    • 새 포스팅이 기록되는 순간에 뉴스 피드가 이미 갱신되므로 뉴스 피드를 읽는 데 드는 시간이 짧아집니다.
  • 단점
    • 친구가 많은 사용자의 경우 친구 목록을 가져오고 그 목록에 잇는 사용자 모두의 뉴스 피드를 갱신하는 데 많은 시간이 소요될 수 있습니다. 이를 핫키(hotkey)라고 부릅니다.
    • 서비스를 자주 이용하지 않는 사용자의 피드까지 갱신해야 하므로 컴퓨터 자원이 자주 낭비됩니다.

읽기 시점에 팬아웃하는 모델#

  • 피드를 읽어야 하는 시점에 뉴스 피드를 갱신합니다. 즉, 요청 기반(on-demand) 모델입니다.
  • 장점
    • 비활성화된 사용자, 또는 서비스에 거의 로그인하지 않는 사용자의 경우에 이 모델이 유리합니다.
    • 데이터를 친구 각각에 푸시하는 작업이 필요 없으므로 핫키 문제가 없습니다.
  • 단점
    • 뉴스 피드를 읽는 데 많은 시간이 소요될 수 있습니다.

피드 읽기 흐름 상세 설계#

피드 읽기 상세 설계

캐시 구조#

뉴스피드뉴스피드
콘텐츠인기 콘텐츠일반 콘텐츠
소셜 그래프팔로어팔로잉
행동'좋아요'답글기타
횟수좋아요 횟수답글 횟수기타
  • 뉴스 피드: 뉴스 피드의 ID를 보관합니다.
  • 콘텐츠: 포스팅 데이터를 보관합니다. 인기 콘텐츠는 따로 보관합니다.
  • 소셜 그래프: 사용자 간 관계 정보를 보관합니다.
  • 행동(action: 포스팅에 대한 사용자의 행위에 관한 정보를 보관합니다. 포스팅에 대한 좋아요, 답글 등등이 이에 해당합니다.
  • 횟수(counter): 좋아요 횟수, 응답 수, 팔로어 수, 팔로잉 수 등의 정보를 보관합니다.

4단계 마무리#

  • 아래의 사항에 대해 추가적으로 더 이야기하면 좋습니다.
  • 데이터베이스 규모 확장
    • 수직정 규모 확장 vs 수평적 규모 확장
    • SQL vs NOSQL
    • 주부(master-slave) 다중화
    • 복제본(replica) dp eogks dlfrrl dustks
    • 일관성 모델(consistency model)
    • 데이터베이스 샤딩(sharding)
  • 아래의 추가 사항이 있습니다.
    • 웹 계층(web tier)을 무상태로 운영
    • 가능한 한 많은 데이터를 캐시할 방법
    • 여러 데이터 센터를 지원할 방법
    • 메시지 큐를 사용하여 컴포넌트 사이의 결합도 낮추기
    • 핵심 메트릭에 대한 모니터링
Last updated on