들어가기 앞서
소셜 미디어와 관련된 개발 경험이 없어 어떤 예시를 들어야 할지 잘 모르겠습니다. 최근에 유튜브에서 페이스북의 스토리에 대한 영상을 보았는데 너무 재미있었어요. 또한 페이스북의 지속적인 도전이 얼마나 대단했는지 느낄수 있었습니다. 오늘은 페이스북의 뉴스피드 설계에 대한 내용을 살표볼 예정입니다. 페이스북의 스토리와 뉴스피드의 탄생 스토리가 궁금하신 분들은 잠시 쉬어가는 타임으로 영상 추천드립니다.
https://youtu.be/NWcquFb4iKo?si=LydrjWWbKCO1Fbtm
뉴스 피드 시스템 설계
뉴스 피드는 홈페이지 중앙에 지속적으로 업데이트되는 스토리들입니다. 해당 스토리에는 사진, 동영상, 링크, 광고등 다양한 것들을 포함하고 있습니다. 아래는 별스타그램의 뉴스피드 입니다.

1단계 : 문제 이해 및 설계 범위 확정
우선 설계를 하기 전에 요구사항에 대해 파악하면 좋습니다.
요규사항
- 모바일 앱, 웹을 둘 다 지원해야 한다.
- 뉴스 피드 페이지에 새로운 스토리를 올릴 수 있어야 하고, 친구들이 올리는 스토리를 볼 수도 있어야 한다.
- 최신 포스트가 위에 오도록 해야 한다. 단순히 시간 흐름의 역순으로 표시한다.
- 한명의 사용자는 최대 5,000명의 친구를 가질 수 있다.
- 트래픽 규모는 매일 천만 명이 방문한다고 가정한다.
- 스토리에는 이미지나 비디오 등의 미디어 파일이 포함 될 수 있다.
2단계 : 개략적 설계안 제시 및 동의 구하기
설계안은 크게 피드 발행과 뉴스 피드 생성 두 가지로 나뉘어 집니다.
- 피드 발행 : 사용자가 스토리를 포스팅하면 해당 데이터를 캐시와 데이터베이스에 기록한다.
- 뉴스 피드 생성 : 사용자의 모든 친구의 포스팅을 시간 흐름 역순으로 모아서 만든다.
피드발행
- 포스팅 저장 서비스 : 새 포스팅을 데이터베이스와 캐시에 저장한다.
- 포스팅 전송 서비스 : 새 포스팅을 친구의 뉴스 피드에 푸시한다. 뉴스 피드 데이터는 캐시에 보관하여 빠르게 읽어 갈 수 있도록 한다.
- 알림 서비스 : 친구들에게 새 포스팅이 올라왔음을 알리거나, 푸시알림을 보내는 역할을 담당한다.

뉴스 피드 생성
- 뉴스 피드 서비스 : 캐시에서 뉴스 피드를 가져오는 서비스다.
- 뉴스 피드 캐시 : 뉴스 피드를 렌더링 할 때 필요한 피드 ID를 보관한다.

3단계 : 상세 설계
피드 발행 흐름
이번 피드 발행 흐름의 상세 설계안에서는 웹 서버와 포스팅 전송 서비스에 초점을 맞춘다.

웹 서버
웹 서버는 클라이언트와 통신할 뿐만 아니라 인증이나 처리율 제한 등의 기능도 수행한다. 또한 스팸을 막고 유해한 콘텐츠가 자주 올라오는 것을 방지하기 위해서 특정 기간 동안 한 사용자가 올릴 수 있는 포스팅의 수를 제한 두어야 한다.
포스팅 전송 (팬아웃) 서비스
포스팅 전송, 즉 팬아웃은 어떤 사용자의 새 포스팅을 그 사용자의 모든 친구에게 전달하는 과정이다. 팬아웃에는 쓰기 시점에 팬아웃(fanout-on-write)으로 Push모델이라고도 하며, 읽기 시점에 팬아웃(fanout-on-read)하는 Pull모델이 있다.
쓰기 시점의 팬 아웃 모델
새로운 포스팅을 기록하는 시점에 뉴스피드를 갱신하게 된다. 포스팅이 완료되면 바로 해당 사용자의 캐시에 해당 포스팅을 기록한다.
장점
- 뉴스 피드가 실시간으로 갱신되며, 친구 목록에 있는 사용자에게 즉시 전송된다.
- 새 포스팅이 기록되는 순간에 뉴스 피드가 이미 갱신되므로 뉴스 피드를 읽는데 시간이 짧아 진다.
단점
- 친구가 많은 사용자의 경우 친구 몰고을 가져오고 그 목록에 있는 사용자 모두의 뉴스 피드를 갱신하는데 많은 시간이 소요될 수도 있다. 즉, 핫키 문제가 발생한다.
- 서비스를 자주 이용하지 않는 사용자의 피드까지 갱신해야 하므로, 컴퓨팅 자원이 낭비된다.
읽기 시점에 팬 아웃 모델
피드를 읽어야 하는 시점에 뉴스피드를 갱신한다. 따라서 요청 기반 모델이다. 사용자 본인 홈페이지나 타임라인을 로딩하는 시점에 새로운 포스트를 가져오게 된다.
장점
비활성화된 사용자, 또는 거의 사용하지 않는 사용자의 경우 로그인 하기 전까지 컴퓨팅 자원을 사용하지 않기 때문에 유리하다.
데이터를 친구 각각에 푸시하는 작업이 필요 없으므로 핫키 문제도 생기지 않는다.
단점
뉴스 피드를 읽는데 많은 시간이 소요될 수 있다.
새로운 설계안 (장단점 취합)
본 설계안은 두 가지 방법을 결합하여 장점은 취하고 단점은 버리는 전략이다. 뉴스 피드를 빠르게 가져오는 것은 매우 중요하다. 대부분의 사용자에 대해서는 쓰기 시점의 팬아웃 모델을 사용한다. 친구나 팔로어가 아주 많은 사용자의 경우에는 팔로어로 하여금 해당 사용자의 포스팅을 필요할 때 가져가도록 하는 읽기 시점의 팬아웃 모델을 사용하여 시스템 과부하를 방지할 수 있다. 또한 안정 해시를 통해 요청과 데이터를 보다 고르게 분산하여 핫키 문제를 줄여 볼 수 있다.
가상 면접 사례로 배우는 대규모 시스템 설계 기초 (feat. 5장)


새로운 팬아웃 서비스는 다음과 같이 동작합니다.
- 그래프 데이터베이스에서 친구 ID모곩을 가져온다. 그래프 데이터베이스는 친구 관계나 친구 추천을 관리하기 적합하다.
- 사용자 정보 캐시에서 친구들의 정보를 가져온다. 그런 후에 사용자 설정에 따라 친구 가운데 일부를 걸러낸다. 친구 중 누군가의 피드 업데이트를 무시하기로 설정했다면 뉴스 피드에 보이지 않아야 한다. 일부 사용자에게만 공유하기도 동일하다.
- 친구 목록과 새 스토리의 포스팅 ID를 메시지 큐에 넣는다.
- 팬아웃 작업 서버가 메시지큐에서 데이터를 꺼내 뉴스피드 데이터를 뉴스 피드 캐시에 넣는다.
- 뉴스 피드 캐시는 <포스팅ID, 사용자ID> 순서 쌍으로 보관하는 매핑 테이블 이다.
- 새로운 포스팅이 만들어 질 때마다 레코드가 추가된다.
- ID만 저장하고 포스팅 정보 전부를 저장하지 않는 이유는 메모리 요구량이 지나치게 늘어날 수 있기 때문이다.
- 메모리의 크기를 적정 수준으로 유지하고 크기에 제한을 둔다. 대부분 최신 스토리만 보기에 캐시 미스 날 확률이 낮다.
피드 읽기 흐름 상세 설계
뉴스 피드를 읽는 과정 전반의 상세 설계안은 다음과 같다.

이미지나 비디오 같은 미드어 콘텐츠는 CDN에 저장하여 빨리 읽어갈 수 있도록 하였다.
- 사용자가 뉴스 피드를 읽으려는 요청을 보낸다.
- 로드밸런서가 요청을 웹 서버에게 보낸다.
- 웹 서버는 피드를 가져오기 위해 뉴스 피드 서비스를 호출한다.
- 뉴스 피드 서비스는 뉴스 피드 캐시에서 포스팅 ID목록을 가져온다.
- 뉴스 피드에 표시할 사용자 이름, 사용자 사진, 포스팅 콘텐츠, 이미지 등을 사용자 캐시와 포스팅 캐시에서 가져와 완전한 뉴스 피드를 만든다.
- 생성된 뉴스 피드를 JSON 형태로 클라이언트에게 보낸다.
- 클라이언트는 해당 피드를 렌더링 한다.
캐시 구조
캐시는 뉴스 피드 시스템의 핵심 컴포넌트이다.
| 뉴스피드 | 뉴스 피드 |
| 콘텐츠 | 인기 콘텐츠 / 일반 콘텐츠 |
| 소셜 그래프 | 팔로어 / 팔로잉 |
| 행동 | 좋아요 / 답글 / 기타 |
| 횟수 | 좋아요 횟수 / 답글 횟수 / 기타 |
4단계 : 마무리
시간이 여유롭다면 규모 확장성 이슈를 고려해 보면 좋다.
데이터베이스 규모 확장
- Scale Up 확장 vs Scale Out 확장
- SQL vs NoSQL
- Master-Slave 다중화
- Replication에 대한 읽기 연산
- 일관성 모델
- 데이터베이스 샤딩
추가적인 논의 주제
- 웹 계층을 무상태로 운영하기
- 가능하면 많은 데이터를 캐시할 방법
- 여러 데이터 센터를 지원할 방법
- 메시지 큐를 사용하여 컴포넌트 사이의 결합도 낮추기
- 핵심 메트릭에 대한 모니터링 - 트래픽이 몰리는 시간대에 사용자가 뉴스 피드를 새로고침 할 때의 지연시간 등.
'기술서적으로 배우는 기술' 카테고리의 다른 글
| 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (feat. 12장 채팅 시스템 설계) (3) | 2025.01.19 |
|---|---|
| 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (feat. 10장 알림 시스템 설계) (3) | 2025.01.15 |
| 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (feat. 8장 URL 단축기 설계) (1) | 2025.01.15 |
| 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (feat. 7장 분산 시스템을 위한 유일 ID 생성기 설계) (4) | 2025.01.11 |
| 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (feat. 4장 처리율 제한 장치의 설계) (3) | 2025.01.10 |