책정리/대규모 시스템 설계 기초

뉴스 피드 시스템 설계

뽀글보리 2023. 12. 6. 07:03
반응형

11장 뉴스 피드 시스템 설계

요구사항

  • 앱, 웹 모두 지원해야한다.
  • 뉴스 피드에 새로운 스토리를 올리고 친구들의 스토리를 볼 수 있도록 한다.
  • 단순히 시간 흐름 역순으로 피드에 표시된다.
  • 한 사람당 최대 5000명의 친구를 가질 수 있다.
  • 매일 천만명이 방문한다.
  • 피드에는 이미지, 비디오 등도 포함될 수 있다.

개략적 설계안 제시

뉴스 피드 시스템에는 크게 2가지 기능이 있다.

  1. 피드 발행 사용자가 스토리를 포스팅하면 해당 데이터를 캐시와 데이터베이스에 기록한다.
  2. 뉴스 피드 생성 모든 친구의 포스팅을 시간 흐름 역순으로 모아서 만든다.

Rest API방식으로 API를 설계한다고 하면, 피드 발행 API는 POST /v1/me/feed

피드 읽기 API는 GET /v1/me/feed로 구현한다.

요청하는 유저의 정보를 알기 위해서 Authorization 헤더가 필요하다.

 

 

포스팅 저장 서비스 새롭게 요청 온 포스팅을 데이터베이스와 캐시에 저장한다.

포스팅 전송 서비스 새 포스팅을 친구의 뉴스 피드에 푸시한다.

알림 서비스 친구들에게 새 포스팅에 대한 알림을 보낸다.

 

뉴스피드 서비스 GET 요청을 통해 피드 읽기 API를 호출 시 캐시에서 뉴스 피드를 가져온다.

뉴스피드 캐시 뉴스 피드를 렌더링하기 위한 뉴스 피드 ID를 보관한다.

피드 발행 흐름 상세 설계

웹서버에서 인증, 처리율 제한 등의 기능을 수행한다.

 

포스팅 전송

포스팅 전송은 어떤 사용자의 새 포스팅을 그 사용자와 친구 관계에 있는 모든 사용자에게 전달하는 과정이다.

포스팅 전송 시 사용할 수 있는 두 가지 모델이 있다.

  1. 쓰기 시점에 팬아웃 (Push 모델)
    • 새로운 포스팅을 기록하는 시점에 뉴스 피드를 갱신한다. 이때 캐시에 기록한다.
    • 뉴스 피드가 실시간으로 갱신되며, 사용자에게 즉시 전송된다. 뉴스 피드를 읽는 데 드는 시간이 짧아진다.
    • 친구가 많으면 뉴스 피드 갱신에 많은 시간이 소요될 수 있다. (핫키 문제)
    • 서비스를 자주 이용하지 않는 사용자의 피드까지 갱신해야 하므로 자원이 낭비된다.
  2. 읽기 시점에 팬아웃 (Pull 모델)
    • 비활성화된 사용자의 경우에는 이 모델이 유리하다.
    • 데이터를 친구 각각에 푸시하지 않으므로 핫키 문제도 발생하지 않는다.
    • 뉴스 피드를 읽는 데 많은 시간이 소요될 수 있다.

두 가지 모델의 합의점

  • 뉴스 피드를 빠르게 가져오는 것은 중요하므로 대부분의 사용자에는 푸시 모델을 사용하지만, 친구나 팔로어가 아주 많은 사용자의 경우에는 풀 모델을 사용하여 시스템 과부하를 방지한다.
  • 안정 해시를 사용하여 데이터를 고르게 분산하여 핫키 문제를 줄여본다.

 

결론

 

팬아웃 서비스는 그래프 데이터베이스에서 친구 ID 목록을 가져오고, 사용자 정보 캐시에서 친구들의 정보를 가져온다. 뮤트한 친구 관계는 걸러낸다. 친구 목록과 새 스토리의 포스팅 ID를 메시지 큐에 넣는다. 팬아웃 작업 서버가 메시지 큐에서 데이터를 꺼내어 뉴스 피드 데이터를 캐시에 넣는다. 대부분의 사용자는 최신 스토리만 보기 때문에 캐시 미스가 일어날 확률은 낮다.

뉴스 피드 서비스는 캐시에서 포스팅 ID 목록을 가져오고, 사용자캐시와 포스팅 캐시를 통해서 완전한 뉴스 피드를 만든다.

 

* 가상 면접 사례로 배우는 대규모 시스템 설계 11장을 읽고 요약한 내용입니다.

반응형