Share
Sign In

뉴스 피드 시스템

API 설계

POST /v1/me/feed # 피드 밠행 @ Authorization Header @ Body GET /v1/me/feed # 뉴스 피드 생성 @Authorization header

피드 발행 (뉴스 만들기)

뉴스 피드 생성 (뉴스 읽기)

상세 설계

웹 서버

인증, 처리율 제한 등을 수행하는 API Gateway이다.
대부분 클라이언트와 API Gateway 사이에는 HTTPS를, 나머지 내부 시스템은 HTTP 통신을 사용한다.

포스팅 전송(팬아웃 서비스)

새 포스팅을 친구들에게 전파하는 과정
Push 모델과 pull 모델이 있다.
Push model(fanout-on-write)
포스팅이 등록되자마자 친구들에게 전송되기 때문에 피드 갱신 시간이 짧다.
하지만 친구 목록을 가져오는데 시간이 많이 들고(hotkey),
서비스를 자주 사용하지 않는 사용자까지 매번 업데이트해야 하기 때문에 불필요한 비용이 발생한다.
Pull model(fanout-on-read)
사용자가 읽기를 요청할 때 가져오는 온디멘드 방식이다.
hotkey 문제가 없고 비활성 유저를 챙길 필요도 없다.
하지만 피드가 올라올 때까지 시간이 걸리기 때문에 유저가 싫어할 수 있다.

팬아웃 절충안

대부분 사용자는 push 모델을 사용하고, 친구가 많은 사용자에 한해 pull 모델을 사용한다.
안정 해시를 통해 부하를 분산해 hotkey 문제를 해결한다.
캐시의 경우 <user_id, post_id> 매핑 테이블로 만들고 유저당 최신 100개 피드 같은 정책을 사용해 용량 낭비를 줄인다.
post_id를 서버에서 가져오면, 실제 post는 CDN을 통해서 가져온다. 이렇게 하면 서버 자체의 부하를 엄청 줄일 수 있다.

캐시 구조

뉴스 피드 : 뉴스 피드
콘텐츠 : 인기 콘텐츠, 일반 콘테츠
소셜 그래프 : 팔로워, 팔로잉
행동 : 좋아요, 답급, 기타
횟수 : 좋아요 회수 답글 횟수, 기타