- 페이스북의 뉴스 피드에 대한 정의
- 뉴스 피드는 여러분의 홈 페이지 중앙에 지속적으로 업데이트 되는 스토리들로, 사용자 상태 정보 업데이트, 사진, 비디오, 링킄, 앱 활동, 그리고 여러분이 팔로우하는 사람들, 페이지, 그룹으로부터 나오는
좋아요 등을 포함한다
- 뉴스 피드는 여러분의 홈 페이지 중앙에 지속적으로 업데이트 되는 스토리들로, 사용자 상태 정보 업데이트, 사진, 비디오, 링킄, 앱 활동, 그리고 여러분이 팔로우하는 사람들, 페이지, 그룹으로부터 나오는
설계 검토 항목
- 지원 시스템
- 모바일 앱
- 웹
- 중요한 기능
- 뉴스피드에 새로운 스토리를 발행할 수 있어야한다
- 친구들이 올린 스토리를 볼 수 있어야 한다
- 뉴스피드 스토리 노출 순서
- 토픽 점수(Topic Score)
- 시간 흐름 역순
- 한 명의 사용자가 최대 몇 명의 친구를 가질 수 있는가
- ex) 5000명
- 트래픽 규모
- DAU - 1000만
- 피드에 포함되는 항목
- 이미지, 비디오를 포함한다
설계 범주 분류
1) 피드 발행 (feed publishing)
2) 뉴스 피드 생성 (news feed building)
뉴스 피드 API
- 통신 수단
- HTTP
- 기능
- 피드 발행 API
- 피드 읽기 API
- Authorization 필요
피드 발행 시스템
- 사용자
- 모바일 앱이나 브라우저에서 새 포스팅을 올리는 주체
- 로드밸런서
- 트래픽을 웹 서버들로 분산
- 웹 서버
- HTTP 요청을 내부 서비스로 중계
- 포스팅 저장 서비스
- 새 포스팅을 Cache와 DB에 저장
- 포스팅 전송 서비스
- 새 포스팅을 친구의 피드에 게시(Push) 한다
- 뉴스피드 데이터는 Cache에 저장하여 빠르게 읽을 수 있어야 한다
- 알림 서비스
- 친구들에게 새로운 포스팅이 올라왔음을 알린다
- 푸시 알림을 보낸다
상세 설계
웹 서버
- 역할
- 클라이언트와의 통신은 당연
- 인증 (Authorization)
- 처리율 제한
- 사용자 당 포스팅 게시 수 제한
- 스팸 및 유해한 컨텐츠 방지
포스팅 전송(팬아웃) 서비스
- 역할
- 팬아웃 : 어떤 사용자의 새 포스팅을 그 사용자의 친구 관계에 있는 모든 사용자에게 전달하는 과정
- 종류
- 쓰기 시점 팬아웃
- Push
- 읽기 시점 팬아웃
- Pull
- 쓰기 시점 팬아웃
쓰기 시점 팬아웃
- 장점
- 뉴스 피드 실시간 갱신
- 친구들에게 포스팅 즉시 전송
- 뉴스 피드를 읽는 시간 단축
- 단점
- 친구가 많은 사용자의 경우, 많은 사용자의 피드를 모두 갱신하는 데 많은 시간 소요 (Hot Key 문제)
- ex) 친구가 5000만 명인 계정의 경우, 게시물 하나 당 5000만 명의 피드를 갱신해 줘야 한다
- 서비스를 사용하지 않는 휴면 계정과 같은 사용자의 피드까지 갱신해야 한다
- 자원 낭비
- 친구가 많은 사용자의 경우, 많은 사용자의 피드를 모두 갱신하는 데 많은 시간 소요 (Hot Key 문제)
읽기 시점 팬아웃
- 요청기반 (on-demand) 모델
- 장점
- 비활성화 된 사용자, 휴면 사용자가 많은 경우 유리
- 자원 효율성
- 데이터 푸시 모델이 아니기에, 핫키 문제 발생하지 않음
- 비활성화 된 사용자, 휴면 사용자가 많은 경우 유리
- 단점
- 뉴스피드 읽기에 많은 시간을 소모
팬아웃 서비스
1) Graph DB에서 친구 ID 목록을 조회
* GraphDB는 친구 관계나, 친구 추천을 관리하기 적합
2) 사용자 정보 Cache에서 친구들의 정보를 조회
* 친구 목록 필터링
* ex) 피드 업데이트 무시 친구
* ex) 일부 사용자에게만 노출되도록 관리
3) 친구 목록과 새 스토리의 포스팅 ID를 메세지 큐에 Push
4) 메세지 큐에서 <포스팅ID,사용자ID> 와 같은 데이터를 꺼내 뉴스 피드 Cache에 넣는다
- ID 값만 넣는 것은 메모리 효율성을 위함이다
피드 읽기 시스템
1) 사용자의 요청이 Web 혹은 Mobile로 부터 발생하여, Load Balancer, Web Server를 거쳐 News Feed Service에 도착한다
- 이미지, 비디오와 같은 항목은 CDN으로부터 가져온다
2) News Feed Service는 뉴스 피드 캐시에서 포스팅 ID 목록을 가져온다
3) 뉴스 피드에 표시할 사용자 정보와 포스팅 정보를 각각의 Cache에서 가져와 뉴스피드를 생성한다
4) 생성 된 뉴스 피드를 Client에게 반환한다
뉴스 피드 시스템의 캐시 구조
- 뉴스피드
- 뉴스피드 ID
- 컨텐츠
- 인기 컨텐츠
- 일반 컨텐츠
- 소셜 그래프 - 사용자 간 관계 정보
- 팔로워
- 팔로잉
- 행동 - 포스팅에 대한 사용자의 행위에 대한 정보
- 좋아요
- 답글
- ...
- 횟수 - 좋아요 수, 팔로우 수 등 수에 대한 정보를 보관
- 좋아요 횟수
- 답글 횟수
- 팔로어 수
- 팔로잉 수
- ...
이슈
- DB
- 수직적 규모 확장 vs 수평적 규모 확장
- SQL vs NoSQL
- Master-Slave
- Replica에 대한 읽기 연산
- 일관성 모델
- DB Sharding
- Web Tier 무상태 운영
- 데이터 Caching
- Messaging Queue로 Service간 결합도 낮추기
- 핵심 Metric에 대한 모니터링 및 트래픽 분석
반응형
'개발 > 대규모 시스템 설계' 카테고리의 다른 글
12장 - 채팅 시스템 설계 (2) - 접속 상태 (0) | 2023.09.06 |
---|---|
12장 - 채팅 시스템 설계 (1) - 메세지 흐름 (0) | 2023.08.30 |
10. 알림 시스템 설계 (0) | 2023.05.08 |
9. 웹 크롤러 설계 (0) | 2023.04.09 |
8. URL 단축키 설계 (0) | 2023.04.02 |
댓글