뉴스 피드는 홈 페이지 중앙에 지속적으로 업데이트되는 스토리이다. (페이스북, 인스타그램 피드 설계)
1단계 문제 이해 및 설계 범위 확정
- 앱, 웹 모두 지원
- 새로운 스토리를 올리고, 친구들이 올리는 스토리를 볼 수도 있다.
- 시간 흐름 역순
- 한 사용자는 5천명의 친구를 가질 수 있다.
- 매일 천만 명이 방문 (10million DAU)
- 이미지나 비디오 등 미디어 파일이 포함될 수 있다.
2단계 개략적 설계안 제시 및 동의 구하기
- 피드 발행: 스토리를 포스팅하면 해당 데이터를 캐시와 DB에 기록한다.
- 뉴스 피드 생성: 모든 친구의 포스팅을 시간 흐름 역순으로 모아서 만든다.
뉴스 피드 API
피드 발행 API
새 스토리를 포스팅하기 위한 API다.
피드 읽기 API
뉴스 피드를 가져오는 API다.
피드 발행
- 사용자: 새 포스팅을 올리는 주체
- 로드밸런서
- 웹 서버
- 포스팅 저장 서비스: 새 포스팅을 DB와 캐시에 저장한다.
- 포스팅 전송 서비스: 새 포스팅을 친구의 뉴스 피드에 푸시한다. 뉴스 피드 데이터는 캐시에 보관하여 빠르게 읽어갈 수 있도록 한다.
- 알림 서비스: 친구들에게 새 포스팅이 올라왔음을 알리거나, 푸시 알림을 보내는 역할
뉴스 피드 생성
- 사용자: 뉴스 피드를 읽는 주체
- 로드 밸런서
- 웹 서버
- 뉴스 피드 서비스: 캐시에서 뉴스 피드를 가져오는 서비스
- 뉴스 피드 캐시: 뉴스 피드를 렌더링할 때 필요한 피드 ID를 보관한다.
3단계 상세 설계
피드 발행 흐름 상세 설계
웹 서버
클라이언트와 통신, 인증, 처리율 제한 기능 수행
포스팅 전송(fanout) 서비스
어떤 사용자의 새 포스팅을 그 사용자와 친구 관계에 있는 모든 사용자에게 전달하는 과정이다.
2가지 모델
- 쓰기 시점 팬아웃 (fanout-on-write, push)
- 읽기 시점 팬아웃 (fanout-on-read, pull)
캐시 구조
뉴스 피드 시스템의 핵심 컴포넌트다.
- 뉴스 피드: 뉴스 피드의 ID 보관
- 콘텐츠: 포스팅 데이터를 보관한다.
- 소셜 그래프: 사용자 간 관계 정보를 보관한다.
- 행동: 포스팅에 대한 사용자의 행위에 관한 정보를 보관한다.
- 횟수: 좋아요 횟수, 응답 수, 팔로어 수, 팔로잉 수 등의 정보를 보관한다.
'정기간행물 > daily' 카테고리의 다른 글
채팅 시스템 설계 (대시설기) (0) | 2023.10.07 |
---|---|
검색어 자동완성 시스템 (대시설기) (1) | 2023.10.04 |
알림 시스템 설계 (0) | 2023.09.29 |
웹 크롤러 설계 (대시설기) (0) | 2023.09.28 |
Chain of Responsibility (0) | 2023.09.26 |