11장은 뉴스 피드(news feed) 설계에 대해 다룬다.
뉴스 피드란?
사용자에게 자주 업데이트되는 콘텐츠를 제공하는 데 쓰이는 데이터 포맷이다. 콘텐츠 배포자들은 웹 피드를 중개함으로써 사용자들이 이들을 구독할 수 있게 한다.
출처 - 위키피디아
요구사항 예시
- 모바일 앱, 웹 모두 지원
- 사용자가 업로드한 스토리 및 친구들이 올리는 스토리를 볼 수 있어야 함
- 피드는 최근 순으로 정렬
- 사용자는 5천 명의 친구를 맺을 수 있음
- 10M의 DAU를 가짐
- 피드는 이미지, 비디오 모두 포함
개략적 설계
뉴스 피드는 피드 발행(feed publishing), 피드 생성(feed building) 두 가지 부분으로 나뉘어 있다.
- 피드 발행: 사용자가 스토리를 포스팅하면 해당 데이터를 cache와 DB에 기록한다. 이때 친구의 뉴스 피드에도 전송된다.
- 피드 생성: 모든 친구의 포스팅을 최신 순으로 모아서 만든다고 가정한다.
뉴스 피드 API
뉴스 피드 API는 클라이언트가 서버와 통신하기 위해 사용하는 수단이다.
피드 발행 API
스토리를 포스팅하기 위한 API
POST /v1/me/feed
- body: posting 내용
- Authorization 헤더: API 호출 인증
피드 생성 API
뉴스 피드를 가져오는 API
GET /v1/me/feed
- Authorization 헤더: API 호출 인증
상세 설계
피드 발생 흐름 상세 설계
팬아웃 서비스
팬아웃(fanout) 서비스는 어떤 사용자의 새 포스팅을 사용자와 친구 관계에 있는 모든 사용자게 전달하는 과정이다.
팬아웃은 쓰기 모델(push model)과 읽기 모델(pull model)로 나눌 수 있다.
push model(pre-computing)
새로운 포스팅을 기록하는 시점에 뉴스 피드 갱신한다.
- 장점
- 피드가 실시간으로 갱신되므로 피드 read 시간이 짧아진다.
- 단점
- 친구가 많은 사용자의 경우 hotkey 문제가 발생한다.
- 서비스를 자주 사용하지 않는 사용자의 피드도 갱신하므로 리소스 낭비가 발생한다.
최근에 사전 과제에 뉴스 피드 구현 요구사항이 있었는데, 복기를 해보면 push model을 사용하여 뉴스 피드를 구현하는 요구사항이었던 것 같다.
pull model(on-demand)
사용자가 피드를 읽을 때 뉴스 피드 갱신한다.
- 장점
- 서비스를 자주 사용하지 않는 사용자의 피드를 갱신하지 않으므로 리소스 낭비가 덜 발생한다.
- 피드를 push 하지 않기 때문에 hotkey 문제가 발생하지 않는다.
- 단점
- 피드를 읽는데 많은 시간이 소요될 수 있다.
AWS 교육 때 피드 키 모델링에 대한 교육을 받으면서 피드에 대한 내용이 언급되었다. 그때 트위터 예시를 들면서 피드를 갱신하는 시간은 크게 문제가 되지 않는다고 들었는데, pull model에 대한 것을 말한 것 같다.
실제 트위터와 메타의 서비스를 보면 push mdoel과 pull model 모두 병행하여 사용하는 것 같다.
피드 읽기 흐름 상세 설계
캐시 구조
캐시는 뉴스 피드 시스템의 핵심 컴포넌트다.
- 뉴스 피드: 뉴스 피드 ID 보관
- 콘텐츠: 포스팅 데이터 보관, 인기 콘텐츠는 따로 보관
- 소셜 그래프: 사용자 간 관계 정보 보관
- 행동: 포스팅에 대한 사용자 행위 정보 보관
- 횟수: 좋아요, 응답, 팔로어와 같은 카운트 정보 보관
'기술독서 > 대규모 시스템 설계 기초' 카테고리의 다른 글
[대규모 시스템 설계 기초] 14장 - 유튜브 설계 (1) | 2024.04.28 |
---|---|
[대규모 시스템 설계 기초] 13장 - 검색어 자동완성 시스템 설계 (0) | 2024.04.24 |
[대규모 시스템 설계 기초] 12장 - 채팅 시스템 설계 (0) | 2024.03.28 |
[대규모 시스템 설계 기초] 10장 - 알림 시스템 설계 (1) | 2024.03.15 |
[대규모 시스템 설계 기초] 9장 웹 크롤러 설계 (0) | 2024.03.06 |