11장 뉴스 피드 시스템 설계
뉴스 피드라고 하니 뭔가 BBC나 네이버 뉴스 같은 느낌이 들 수 있지만 그런건 아니다. 이번 장에서 말하는 뉴스 피드는 인스타그램, 페이스북, 트위터 같은 SNS의 메인 피드를 말한다. 그러니까 다른 사람들이 쓴 글이 무한 스크롤로 보여지는 그 공간이다.
같은 시간이더라도 내가 보는 피드 화면과 내 친구가 보는 피드 화면은 다르다. 팔로잉과 팔로워, 좋아요와 댓글, 공유, 차단 등 활동이 다르기 때문이다. 피드 시스템은 각 유저별로 서로 다른 화면을 보여줘야 한다.
피드 시스템은 크게 2가지 부분으로 이루어진다. 유저 한 명마다 서로 다른 게시물을 보여줘야 하는 목표를 효율적으로 달성하기 위해서다.
정확히는 ‘게시물을 전파하는’ 방법이 2가지가 있다. 사용자가 새 게시물을 썼을 때, 그 글을 봐야 하는 모든 사람들(예: 인스타그램의 팔로워, 페이스북의 친구)에게 전달하는 과정이다. 이를 팬아웃(fanout)이라고 한다.
사용자 A가 새 글을 기록할 때마다 A의 친구 목록에 있는 사람들 모두에게 글이 전송된다.
사용자 A가 피드를 읽을 때마다 새로운 글을 가져와서 A의 피드를 갱신한다.
대부분 컴퓨터 엔지니어링 기법이 그렇듯, 한가지 방식만 쓰면 장단점이 너무 명확하기 때문에 이 둘을 섞어서 쓰면 좀 더 나은 방법이 탄생한다. 여기서도 그렇다. 위 2가지 모델의 장점만 취하고자 한다면 아래와 같은 방법을 생각해볼 수 있다.
그림으로 표현하면 다음과 같다. 시간은 왼쪽에서 오른쪽으로 흐른다.
일반인 1과 유명인 1을 모두 팔로우하고 있는 팔로워 1명이 있다고 하자. 가장 아랫줄에 있는 흰색 네모가 팔로워가 보는 피드다. 일반인 1이 글 A를 쓰면 해당 글을 글 저장소로 저장함과 동시에 팔로워의 피드에도 저장된다. 일반인의 글은 푸시 모델의 대상이 되기 때문이다. 일반인 1이 적은 글 C도 마찬가지다.
반면 유명인 1이 적은 글 B는 팔로워의 피드에 곧바로 전파되지 않는다. 대신 글 저장소에 저장만 된다. 그러면 글 B는 언제 팔로워에게 보여지게 될까? 바로 팔로워가 피드를 새로고침 했을 때다. 새로고침을 하면 팔로워의 친구 목록에 유명인, 즉 풀 모델의 대상이 되는 사람이 있는지 확인하고 글 저장소에 그 사람들의 글을 요청한다. 그 다음 그 글을 피드에 적절히 추가한다. 위 그림에서는 피드를 최신순으로 나열하는 경우를 표현한 것이다.
웹서버는 사용자의 게시글 생성 요청을 받았을 때, 다음과 같은 일을 수행해야 한다.
새로운 글 1개에 대해 위 3가지 이벤트가 모두 일어나야 한다. 사용자가 적은 글을 저장해야 하고, 그 글을 친구 목록에 있는 다른 사용자에게 전파해서 그들의 피드에도 새 글을 저장해야 한다. 물론 새 글 전체를 중복으로 저장하는건 너무 용량을 많이 먹기 때문에 메타데이터만 저장할 것이다. 마지막으로 새 글이 올라왔다는 알림도 보내면 된다.
그래프 데이터베이스 데이터를 마치 그래프처럼 관리하는 DB다. 노드와 엣지, 프로퍼티로 구성된다. 각 데이터간의 관계를 저장하기 좋은 데이터베이스의 일종이다. 따라서 친구 관계 관리, 친구 추천 등을 구현하는데 유용하게 쓰인다. 피드 시스템에서는 풀 모델, 푸시 모델에서 ‘친구 목록'을 불러올 때 이 DB에서 가져오게 된다.
이 둘은 모두 속도를 높이기 위해 사용된다. 캐시를 한 군데만 두는게 아니라 여러 계층으로도 둘 수 있다. 책에서 제시한 방법은 캐시를 5계층으로 나눈다: 피드의 ID를 보관하는 피드 계층, 포스팅 데이터를 보관하는 콘텐츠 계층, 사용자 간 관계 정보를 보관하는 소셜 그래프, 포스팅에 대한 좋아요, 답글 등 행동을 저장하는 행동 계층, 마지막으로 좋아요, 응답, 팔로어 수 등을 저장하는 횟수 계층이다. 캐시의 일종으로 CDN을 사용할 수도 있다.