DevSprout / System-Design-Interview

:books: 가상 면접 사례로 배우는 대규모 시스템 설계 기초 스터디
6 stars 0 forks source link

Chapter 11. 뉴스 피드 시스템 설계 #11

Open MinJunKweon opened 2 years ago

MinJunKweon commented 2 years ago

느낀점


정리

설계 범위 확정

개략적 설계안

뉴스 피드 API

피드 발행 API

POST /v1/me/feed

<Parameters>
Body : 포스팅 내용
Authorization 헤더 : API 호출을 인증하기 위해 사용

피드 읽기 API

GET /v1/me/feed

<Parameters>
Authorization 헤더 : API 호출을 인증하기 위해 사용

피드 발행

image

뉴스 피드 생성

image

상세 설계

image

포스팅 전송(Fanout) 서비스 모델 종류와 장단점

팬아웃 과정

  1. 그래프 DB(Graph DB)에서 친구 ID를 가져옴. (Graph DB는 친구 관계나 추천을 관리하기 적합)
  2. 캐시에서 친구들의 정보를 가져옴. ⇒ 이후 공개여부나 사용자 개인의 설정에 따라 피드 업데이트를 무시할 사용자를 걸러냄
  3. 친구 목록과 새 스토리의 포스팅 ID를 메시지 큐에 발행.
  4. 팬아웃 워커가 뮤케엇 데이터를 꺼내서 뉴스피드 캐시에 갱신. ⇒ 메모리 크기를 적절히 제한해서 적당한 데이터만 올려놓음. 오래된 데이터는 캐시 미스로 새로 불러오게끔 설계 (보통 최신의 데이터만 확인하므로 전부 훑어보는 경우는 지극히 낮음)

❗ 뉴스 피드 캐시는 Post ID - User ID 으로 이루어진 키-값 페어 구조로 되어있다.

피드 읽기 흐름 상세 설계

image

  1. 유저 클라이언트가 로드밸런서로 GET /v1/me/feed 요청 전송
  2. 요청이 웹 서버 중 하나로 로드밸런싱됨
  3. 웹 서버는 피드를 가져오기 위해 뉴스피드 서비스를 호출함
  4. 뉴스 피드 서비스는 뉴스 피드 캐시에서 포스팅 ID 목록을 가져옴
  5. 뉴스 피드에 표시할 내용을 User CachePost Cache에서 가져옴. (캐시 미스 시, DB Read)
  6. 생성된 뉴스 피드를 JSON 형태로 클라이언트에 응답. ⇒ 클라이언트는 결과 피드를 렌더링

논의해볼만한 주제

minkukjo commented 2 years ago

느낀 점

LOG-INFO commented 2 years ago

끄적끄적

궁금한 점