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. 뉴스피드 시스템의 고수준 설계