참고
피드 시스템 설계
NOTE
피드 시스템이란 지속적으로 업데이트되는 스토리들로, 페이스북, 인스타그램, 트위터 타임라인 등을 예시로 들 수 있다.
Fan-out → Input이 들어올때 여러 개의 task로 분산되서 나감
Fan-in → task가 하나로 취합하는 merge를 거친다.
•
어떤 사용자의 새 포스팅을 그 사용자와 친구 관계에 있는 모든 사용자에게 전달한다.
◦
⇒ 팬 아웃 서비스
•
팬 아웃에는 2가지 모델이 존재한다.
◦
Push 모델(쓰기 시점에 팬아웃 한다)
◦
Pull 모델(읽기 시점에 팬아웃 한다)
Fan-out read(Pull 모델)
NOTE
피드를 읽어야 하는 시점에 뉴스 피드를 갱신한다!
피드를 읽을 때 1번 유저가 팔로우한 회원의 Post를 조회한다.
장점
•
비활성화된 사용자, 또는 서비스를 거의 사용하지 않는 사용자의 경우에는 로그인하기까지에는 어떤 자원도 소모하지 않는다.
단점
•
뉴스 피드를 읽는데 많은 시간이 소요된다.
Fan-out write(Push 모델)
NOTE
새로운 포스팅을 기록하는 시점에 뉴스 피드를 갱신하게 된다!
Post를 쓰는시점에 피드를 갱신한다.
장점
•
뉴스 피드가 실시간으로 갱신되며 친구 목록에 있는 사용자에게 즉시 전송된다.
•
뉴스 피드를 읽는 시간이 줄어 든다.
단점
•
친구가 많은 사용자의 경우 친구 목록을 가져오고 그 목록에 있는 모두의 뉴스 피드를 갱신하는데 많은 시간이 걸릴 수 있다.
•
서비스를 자주 사용하지 않는 Cold존의 사용자 피드까지 갱신하므로 컴퓨팅 자원이 낭비된다.
정합성과 성능
NOTE
Push 모델 (twitter)
•
공간 복잡도를 희생 (인덱스)
•
게시물 작성과 타임라인 배달의 정합성 보장에 대한 고민이 필요하다.
•
Pull 모델이 비해 시스템 복잡도가 높다
Pull 모델 (facebook)
•
시간 복잡도를 희생 (검색 시간)
•
원본 데이터를 직접 참조하므로, 정합성 보장에 유리하다.
•
하지만 Follow가 많은 회원일수록 처리속도가 느리다.