News-Feed-System
1. 뉴스피드 시스템이란?
- 뉴스피드는 소셜 미디어 플랫폼(Twitter, Facebook, Instagram 등)에서 사용자가 팔로우하는 엔티티들이 생성한 스토리들의 목록입니다.
- 텍스트, 이미지, 비디오뿐만 아니라 좋아요, 댓글, 공유, 광고 등 다양한 활동들을 포함합니다.
- 이 목록은 지속적으로 업데이트되며 사용자의 홈페이지에 표시됩니다.
- 마찬가지로 뉴스피드 시스템은 친구, 팔로워, 그룹, 기타 페이지의 콘텐츠뿐만 아니라 사용자 자신의 게시물도 표시합니다.
1.1 뉴스피드의 역할
- 뉴스피드는 소셜 미디어 플랫폼 사용자들에게 필수적인 기능입니다.
- 최신 업계 동향, 시사 정보, 관련 정보를 계속해서 제공하며, 사용자들이 플랫폼에 정기적으로 돌아와 소통할 수 있는 추가적인 이유를 제공합니다.
1.2 설계의 도전 과제
- 수십억 명의 사용자가 이러한 플랫폼을 사용합니다.
- 시스템의 확장성과 고가용성을 유지하면서 실시간으로 개인화된 뉴스피드를 제공하는 것이 가장 큰 도전 과제입니다.
- 이번 글에서는 Facebook, Twitter, Instagram과 같은 소셜 플랫폼을 위한 뉴스피드 시스템의 고수준 설계와 상세 설계에 대해 논의합니다.
2. 뉴스피드 시스템 설계
- 뉴스피드 시스템 설계를 다음 세 가지 단계로 나누어 진행합니다.
- 문제의 범위를 제한하여 체계적으로 접근하고, 각 단계별로 구체적인 목표를 설정합니다.
- 설계 과정에서 수십억 사용자에게 개인화된 뉴스피드를 제공하는 복잡성을 단계적으로 해결합니다.
2.1 설계 단계
- 요구사항 분석: 기능적 요구사항과 비기능적 요구사항을 식별하고, 매일 수십억 사용자에게 개인화된 뉴스피드를 제공하는 데 필요한 리소스 요구사항을 추정합니다.
- 시스템 설계: 뉴스피드 시스템의 고수준 설계와 상세 설계를 논의하고, API 설계와 데이터베이스 스키마를 기술합니다. 또한 사용자에게 더 나은 경험을 제공하기 위한 뉴스피드 랭킹 방법도 설명합니다.
- 설계 평가: 비기능적 요구사항을 기반으로 뉴스피드 시스템 설계를 평가하고, 설계에 대한 이해도를 확인합니다.
2.2 기능적 요구사항
- 뉴스피드 생성: 사용자가 팔로우하는 페이지, 그룹, 팔로워를 기반으로 뉴스피드를 생성합니다. 사용자는 많은 친구와 팔로워를 가질 수 있으므로, 시스템은 모든 친구와 팔로워로부터 피드를 생성할 수 있어야 합니다.
- 콘텐츠 선별과 랭킹: 잠재적으로 엄청난 양의 콘텐츠에서 사용자에게 적합한 콘텐츠를 선택하고, 우선순위를 정하여 어떤 것을 먼저 보여줄지 결정합니다.
- 뉴스피드 콘텐츠: 뉴스피드는 텍스트, 이미지, 비디오를 포함할 수 있습니다.
- 뉴스피드 표시: 랭킹 메커니즘을 기반으로 모든 활성 사용자의 뉴스피드에 새로운 게시물을 추가하고, 높은 순위의 콘텐츠를 먼저 표시합니다.
2.3 비기능적 요구사항
- 확장성: Twitter, Facebook, Instagram과 같은 플랫폼의 지속적으로 증가하는 사용자 수를 지원할 수 있도록 높은 확장성을 가져야 합니다.
- 내결함성: 시스템이 대량의 데이터를 처리해야 하므로, 시스템 구성 요소 간의 네트워크 장애 상황에서도 시스템 가용성을 보장하는 파티션 허용성이 필요합니다.
- 고가용성: 사용자가 플랫폼에 지속적으로 참여할 수 있도록 서비스가 높은 가용성을 유지해야 합니다. PACELC 정리에 따라 가용성과 내결함성을 위해 강한 일관성을 타협할 수 있습니다.
- 낮은 지연시간: 시스템은 실시간으로 뉴스피드를 제공해야 하므로, 최대 지연시간은 2초를 넘지 않아야 합니다.
3. 리소스 추정
- 뉴스피드 시스템을 위한 플랫폼의 기본 가정을 설정하고 트래픽, 스토리지, 서버 추정을 진행합니다.
- 기본 가정: 일일 10억 사용자, 평균 5억 일일 활성 사용자(DAU), 사용자당 평균 300명의 친구와 250개 페이지 팔로우
3.1 트래픽 추정
- 각 일일 활성 사용자가 하루에 애플리케이션을 10회 실행한다고 가정합니다.
- 일일 총 요청 수:
500M × 10 = 50억 요청/일 = 58K 요청/초
3.2 스토리지 추정
- 피드는 오프라인으로 생성되고 요청 시 렌더링된다고 가정합니다.
- 각 사용자를 위해 상위 200개 게시물을 사전 계산합니다.
- 사용자 메타데이터 스토리지
- 한 사용자의 메타데이터 저장 공간: 50KB
- 10억 사용자 기준:
1B × 50KB = 50TB
- 텍스트 게시물 스토리지
- 모든 게시물은 텍스트를 포함하며, 평균 50KB라고 가정합니다.
- 5억 사용자의 상위 200개 게시물:
200 × 500M × 50KB = 5PB
- 미디어 콘텐츠 스토리지
- 게시물의 1/5은 비디오, 4/5는 이미지를 포함한다고 가정합니다.
- 평균 이미지 크기: 200KB, 평균 비디오 크기: 2MB
- 사용자당 200개 게시물의 스토리지:
- 이미지:
200 × 4/5 × 200KB = 32MB - 비디오:
200 × 1/5 × 2MB = 80MB - 사용자당 총합:
32MB + 80MB = 112MB
- 이미지:
- 5억 사용자 총 미디어 스토리지:
112MB × 500M = 56PB
3.3 서버 수 추정
- 일반적인 서버 한 대는 초당 8,000개의 요청(RPS)을 처리할 수 있습니다.
- 시스템의 일일 활성 사용자 수: 약 5억 명
- 필요한 서버 수:
58,000 RPS ÷ 8,000 RPS = 약 62,500대 서버
4. 시스템 구성 요소
- 뉴스피드 시스템 설계에는 다음과 같은 핵심 구성 요소들이 사용됩니다.
4.1 데이터베이스
- 포스트 저장: 다양한 엔티티들로부터 생성된 포스트를 저장합니다.
- 개인화된 뉴스피드: 각 사용자를 위해 생성된 개인화된 뉴스피드 데이터를 저장합니다.
- 사용자 메타데이터: 사용자 정보와 친구, 팔로워 등 다른 엔티티와의 관계를 저장합니다.
4.2 캐시
- 성능 최적화: 자주 접근하는 데이터에 대한 빠른 액세스를 제공합니다.
- 저장 대상: 포스트, 뉴스피드, 사용자 메타데이터 등을 캐시하여 응답 속도를 향상시킵니다.
- 부하 감소: 데이터베이스에 대한 부하를 줄여 시스템 전반의 성능을 개선합니다.
4.3 블롭 스토리지
- 미디어 콘텐츠 저장: 이미지와 비디오와 같은 대용량 미디어 파일을 효율적으로 저장합니다.
- 확장성: 증가하는 미디어 콘텐츠 요구사항에 대응할 수 있는 확장 가능한 저장소를 제공합니다.
4.4 CDN (Content Delivery Network)
- 콘텐츠 전달 최적화: 엔드유저에게 효과적으로 콘텐츠를 전달합니다.
- 지연시간 감소: 사용자와 가까운 위치에서 콘텐츠를 서빙하여 지연시간을 최소화합니다.
- 백엔드 서버 부담 경감: 정적 콘텐츠 전달을 담당하여 백엔드 서버의 부하를 줄입니다.
4.5 로드 밸런서
- 트래픽 분산: 수백만 클라이언트의 뉴스피드 요청을 사용 가능한 서버 풀에 효율적으로 분산합니다.
- 고가용성: 서버 장애 시에도 서비스 연속성을 보장합니다.
- 확장성: 트래픽 증가에 따라 서버를 동적으로 추가하거나 제거할 수 있도록 지원합니다.
5. 뉴스피드 시스템의 고수준 설계
- 뉴스피드 시스템은 주로 다음 두 가지 작업을 담당합니다.
5.1 핵심 기능
- 피드 생성 (Feed Generation)
- 특정 랭킹 메커니즘을 기반으로 친구와 팔로워의 포스트(또는 피드 항목)를 집계하여 뉴스피드를 생성합니다.
- 피드 발행 (Feed Publishing)
- 피드가 발행될 때 관련 데이터가 캐시와 데이터베이스에 기록됩니다.
- 이 데이터는 텍스트 또는 미디어 콘텐츠일 수 있으며, 친구와 팔로워의 데이터를 포함한 포스트가 사용자의 뉴스피드에 채워집니다.
5.2 시스템 구조
- 뉴스피드 시스템의 고수준 설계는 위에서 언급한 두 가지 핵심 부분으로 구성됩니다.
5.3 주요 구성 요소
- 고수준 설계에 나타난 주요 구성 요소들은 다음과 같습니다.
5.3.1 사 용자 (Users)
- 콘텐츠가 포함된 포스트를 작성하거나 자신의 뉴스피드를 요청할 수 있습니다.
5.3.2 로드 밸런서 (Load Balancer)
- 트래픽을 웹 서버 중 하나로 리디렉션합니다.
5.3.3 웹 서버 (Web Servers)
- 백엔드 서비스를 캡슐화하고 사용자와 다양한 서비스 간의 중간 계층 역할을 수행합니다.
- 인증 및 속도 제한을 강제하는 것 외에도, 다른 백엔드 서비스로 트래픽을 리디렉션하는 역할을 담당합니다.
5.3.4 알림 서비스 (Notification Service)
- 친구나 팔로워로부터 새로운 포스트가 사용 가능할 때마다 뉴스피드 생성 서비스에 알리고, 푸시 알림을 보냅니다.
5.3.5 뉴스피드 생 성 서비스 (Newsfeed Generation Service)
- 사용자의 팔로워/친구 포스트로부터 뉴스피드를 생성하고 뉴스피드 캐시에 보관합니다.
5.3.6 뉴스피드 발행 서비스 (Newsfeed Publishing Service)
- 뉴스피드 캐시에서 사용자의 타임라인으로 뉴스피드를 발행하는 역할을 담당합니다.
- 블롭 스토리지에서 미디어 콘텐츠의 썸네일과 링크를 사용자를 위한 뉴스피드에 추가합니다.
5.3.7 포스트 서비스 (Post Service)
- 사용자가 포스트 생성을 요청할 때 호출되며, 생성된 포스트는 포스트 데이터베이스와 해당 캐시에 저장됩니다.
- 포스트의 미디어 콘텐츠는 블롭 스토리지에 저장됩니다.
시스템 워크플로우
이러한 구성 요소들은 서로 협력하여 사용자에게 실시간으로 개인화된 뉴스피드를 제공하는 완전한 시스템을 구성합니다.
6. API 설계
- API는 클라이언트가 서버와 통신하는 주요 방법입니다.
- 일반적으로 뉴스피드 API는 HTTP 기반으로, 클라이언트가 상태 게시, 뉴스피드 검색, 친구 추가 등의 작업을 수행할 수 있도록 합니다.
- 사용자의 뉴스피드를 생성하고 가져오는 것이 목표이므로, 다음 API들이 필수적입니다.
6.1 사용자 뉴스피드 생성
다음 API는 사용자의 뉴스피드를 생성하는 데 사용됩니다.
generateNewsfeed(user_id)
6.1.1 기능 설명
- 사용자 식별: 사용자 ID를 받아 해당 사용자의 친구와 팔로워를 결정합니다.
- 뉴스피드 생성: 여러 포스트로 구성된 뉴스피드를 생성합니다.
- 오프라인 처리: 내부 시스템 구성 요소에서 사용되므로 오프라인으로 호출하여 사용자를 위한 뉴스피드를 사전 생성할 수 있습니다.
- 저장: 사전 생성된 뉴스피드는 영구 저장소와 관련 캐시에 저장됩니다.
6.1.2 매개변수
- user_id: 뉴스피드를 생성할 사용자의 고유 식별자
6.2 사용자 뉴스피드 조회
다음 API는 사용자의 뉴스피드를 가져오는 데 사용됩니다.
getNewsfeed(user_id, count)
6.2.1 기능 설명
- 뉴스피드 반환: 포스트 목록으로 구성된 JSON 객체를 반환합니다.
- 페이징 지원: count 매개변수를 통해 반환할 포스트 수를 제어할 수 있습니다.