
뉴스 피드 란?
홈 페이지 중앙에 지속적으로 업데이트 되는 스토리들로,
사용자 상태 정보 업데이트, 사진, 비디오, 링크, 앱 활동(app activity), 그리고 페이스북에서 팔로우하는 사람들, 페이지, 또는 그룹으로부터 나오는 '좋아요(likes)' 등을 포함하는 것
비슷한 유형의 문제로 페이스북 뉴스 피드, 인스타그램 피드, 트위터 타임라인 설계 등이 있다고 한다.
1단계. 문제 이해 및 설계 범위 확정
- 모바일 앱, 웹 모두 지원해야함
- 새로운 스토리 올리기 및 보기 다 가능해야한다.
- 피드 나열은 간단하게 시간 흐름 역순(reverse chronological order)으로 : 최신순
- 한 명의 사용자는 최대 5000명의 친구를 가질 수 있음
- 트래픽 규모는 약 1,000만명
- 피드에는 이미지나 비디오 스토리도 올라올 수 있음
2단계. 개략적 설계안 제시 및 동의 구하기
1) 피드 발행(feed publishing) 과
사용자가 스토리 포스팅하면 해당 데이터를 Cache와 DB에 기록.
새 포스팅은 친구의 뉴스피드에도 전송
2) 뉴스 피드 생성(news feed building)
모든 친구의 포스팅을 시간 흐름 역순으로 모아서 생성
의 두가지 부분으로 나누어져 있음
뉴스피드 API
1) 피드 발행 API (HTTP POST 형태로 요청을 보내면 됨)
2) 피드 읽기 API (HTTP GET 형태로 요청을 보내면 됨)
피드 발행

뉴스피드 생성

3단계. 상세 설계
피드 발행 흐름 상세 설계
1) 웹 서버
인증이나 처리율 제한 등이 기능도 수행해야 한다.
- 올바른 인증 토큰을 Authorization 헤더에 넣고 API를 호출하는 사용자만 포스팅 가능하게
- 스팸 막고 유해한 콘텐츠가 올라오는 걸 막기 위해 시간 당 포스팅 수 제한
2) 포스팅 전송(팬아웃) 서비스
어떤 사용자의 새 포스팅을 그 사용자와 친구 관계에 있는 모든 사용자에게 전달하는 과정
팬아웃에는 두 가지 모델이 있는데..
1. 쓰기 시점에 팬아웃(fanout-on-write)하는 모델 푸시(push)모델
새로운 포스팅을 기록하는 시점에 뉴스 피드 갱신
장점
- 뉴스피드가 실시간으로 갱신되고 친구 목록에 있는 사용자에게 즉시 전송됨
- 새 포스팅이 기록되는 순간 뉴스 피드가 이미 갱신되므로(pre-computed) 뉴스 피드를 리딩 시간 줄어듬
단점
- 친구가 많은 사용자의 경우 친구 목록을 가져오고 그 목록에 있는 사용자 모두의 뉴스 피드를 갱신하는 데 많은 시간이 소요될 수 있다. 핫키(hotkey) 문제
- 서비스를 자주 이용하지 않는 사용자의 피드까지 계속 갱신해주므로 컴퓨팅 자원이 낭비
2. 읽기 시점에 팬아웃(fanout-on-read)하는 모델 풀(pull)모델
요청(on-demand) 모델. 사용자가 본인 홈페이지나 타임라인을 로딩하는 시점에 새로운 포스트를 가져오게 됨.
장점
- 비활성화된 사용자 혹은 서비스에 거의 로그인하지 않는 사용자의 경우에는 이 모델이 유리함 → 로그인 전까지는 어떤 컴퓨팅 자원도 소모하지 않음
- 데이터를 친구 각각에 푸시하는 작업이 필요 없으므로 hotkey 문제 또한 발생하지 않는다.
단점
- 뉴스 피드를 읽어들이는데에 많은 시간이 소요될 수도 있다...
그래서?
두개를 섞어서 각자의 장점만 얻어가도록 해보겠다.
대부분의 사용자에 대해서는 push 모델을 사용하고, 친구나 팔로어(follower)가 아주 많은 사용자의 경우에는 팔로어로 하여금 해당 사용자의 포스팅을 필요할 때 가져가도록 하는 pull 모델을 사용해서 시스템 과부하를 방지해보자

피드 읽기 흐름 상세 설계

이미지나 비디오 같은 미디어 콘텐츠는 CDN 에 저장하여 빨리 읽어갈 수 있도록..
캐시 구조

CDN 은 Content Delivery Network 의 약자로 콘텐츠 전송 네트워크를 의미한다.
한 마디로 동영상 등 다양한 콘텐츠를 복잡한 네트워크 환경에서 사용자에게 안정적으로 전송해 주는 서비스
개선제안도.... 그래서 떼놓은걸까요....?
페이스북: 뉴스피드는 이용자가 원하는 콘텐츠를 어떻게 예측할까요?
친밀도 순으로 올려주는 건 알았는데..
1. 방대한 양의 자료를 싹 긁은 다음
2. 내가 좋아요한 것 기반, 좋아요 많이 눌러준 사람 등 정보를 다 모아서
3. 데이터를 쌓는데
4. 또 내가 댓글로 표현을 많이 하는지, 좋아요로 표현을 많이 하는지 이런 걸 분석해서
5. 우선 순위 매긴 다음에
6. 좋아할 만한 게시글들을 위로 올려주도록 해놨다고 함
→ 기술적으로 어떻게 돌아가는지 고민해보면 재밌을 거 같아요 🐵