Foundry
뉴스 피드 시스템 설계
중급
핵심

요구사항과 순서를 정하는 문제

왜 시간순으로 보여주지 않나

소셜 피드를 설계합니다. 사용자가 팔로우한 사람들의 글을 모아 보여주는데, 시간순이 아니라 점수순으로 보여주는 것이 이번 요구사항입니다.

항목
대상소셜 피드
사용자가입 5천만, 일간 활성 1천만
팔로우평균 200개
새 글하루 500만 개
피드 조회하루 3억 회 (초당 3,472)
첫 화면20개
응답 시간상위 1퍼센트가 200ms 이내
반영 지연새 글이 5분 안에 피드에 보이면 된다
순서시간순이 아니다. 점수순

시간순이 무엇을 망가뜨리나

팔로우가 평균 200개이고 각자 하루 몇 개씩 올리면, 하루에 쌓이는 글이 수백 건입니다. 시간순으로 늘어놓으면 가장 최근에 올린 사람이 화면을 차지합니다.

상황시간순의 결과
하루 30개 올리는 계정화면 절반을 그 계정이 채운다
하루 1개 올리는 친한 친구스크롤 한참 아래로 밀린다
어제 올라온 중요한 글다시 볼 방법이 없다

즉 시간순은 올린 빈도가 노출을 정합니다. 사용자가 원하는 것은 자기가 보고 싶은 것이 위에 오는 것이고, 그래서 순서를 점수로 정합니다.

점수순이 새로 만드는 문제

순서를 우리가 정하기로 하면 세 가지가 어려워집니다.

어려워지는 것
순서가 사용자마다 다르다같은 글이 사람마다 다른 자리에 온다
순서가 시간에 따라 변한다방금 본 목록과 다음 목록이 다르다
무엇이 좋은 순서인지 모른다정답이 없어서 재 봐야 안다

시간순 피드에서는 이 셋이 전부 공짜였습니다. 순서가 하나뿐이고 변하지 않고 다툴 여지도 없습니다. 점수순은 그 편의를 포기하는 대가로 관련성을 얻습니다.

읽기가 쓰기의 60배다

피드 조회가 글 작성의 60배이므로 읽기 경로를 미리 만들어 둔다 하루 글 작성 500만 하루 피드 조회 3억. 60배 한 번 쓴 글을 수없이 읽는다 읽을 때 계산하면 그 계산을 60배로 반복한다 쓸 때 또는 미리 만들어 두고, 읽을 때는 꺼내기만 한다 반영이 5분 늦어도 된다는 조건이 이것을 허용한다

새 글은 하루 500만 개인데 조회는 하루 3억 회 (초당 3,472)입니다. 60배입니다.

읽을 때 점수를 계산하면 같은 계산을 60번 반복합니다. 그래서 미리 만들어 두고 읽을 때는 꺼내기만 하는 쪽으로 기울게 됩니다.

이것을 허용하는 조건이 요구사항에 있습니다. 새 글이 피드에 보이기까지 5분까지 늦어도 된다는 항목입니다. 실시간이어야 한다면 미리 만들 시간이 없습니다.

이번 설계에서 다루지 않는 것

뺀 것이유
글을 누구에게 퍼뜨릴지팬아웃 전략에서 다룬 문제다
무엇이 좋은 글인지 학습으로 정하기데이터가 쌓인 뒤의 일이다. 지금은 규칙으로 점수를 만든다
광고와 추천 글 끼워 넣기순서 문제가 정리된 뒤에 붙인다
댓글과 좋아요 자체의 저장우리는 그 숫자를 읽어 쓰는 쪽이다

팬아웃을 범위 밖으로 두는 것이 중요합니다. 글을 팔로워들의 목록에 넣는 문제와, 그 목록을 어떤 순서로 보여줄지의 문제는 다릅니다. 이번에는 뒤쪽만 봅니다.

면접에서 이렇게 나옵니다

Q.시간순 피드에는 어떤 문제가 있습니까

올린 빈도가 노출을 정합니다.

상황시간순의 결과
하루 30개 올리는 계정화면 절반을 그 계정이 채운다
하루 1개 올리는 친한 친구스크롤 한참 아래로 밀린다

팔로우가 200개면 하루에 쌓이는 글이 수백 건입니다. 그중 가장 최근 20개가 첫 화면이므로, 자주 올리는 소수가 화면을 차지합니다.

사용자가 원하는 것은 보고 싶은 것이 위에 오는 것이고, 그래서 순서를 점수로 정합니다.

흔한 실수: 시간순이 공정하다고 보는 것. 시간순은 올린 시각이라는 한 가지 기준에만 공정합니다. 자주 올리는 쪽에 유리하고, 그 편향은 사용자가 고를 수 없습니다.

Q.순서를 점수로 정하면 무엇이 어려워지나요

시간순에서 공짜였던 세 가지를 잃습니다.

어려워지는 것
순서가 사용자마다 다르다같은 글이 사람마다 다른 자리에 온다
순서가 시간에 따라 변한다방금 본 목록과 다음 목록이 다르다
무엇이 좋은 순서인지 모른다정답이 없어서 재 봐야 안다

시간순은 순서가 하나뿐이고 변하지 않고 다툴 여지도 없습니다. 점수순은 그 편의를 포기하는 대가로 관련성을 얻습니다.

흔한 실수: 점수 계산 방법만 고민하고 변하는 순서가 만드는 문제를 나중에 보는 것. 페이지 넘김과 이미 본 글 처리가 여기서 다 걸립니다. 계산보다 이쪽이 어렵습니다.

Q.읽기가 쓰기의 60배라는 것이 설계를 어떻게 바꿉니까

계산을 읽는 쪽에서 쓰는 쪽으로 옮기게 됩니다.

새 글은 하루 500만 개인데 조회는 하루 3억 회 (초당 3,472)입니다. 읽을 때 점수를 계산하면 같은 계산을 60번 반복합니다.

그래서 미리 만들어 두고 읽을 때는 꺼내기만 합니다.

이것을 허용하는 조건이 요구사항에 있습니다. 새 글이 피드에 보이기까지 5분까지 늦어도 된다는 항목입니다.

흔한 실수: 이 조건을 확인하지 않고 미리 계산을 전제하는 것. 실시간 반영이 요구사항이면 미리 만들 시간이 없습니다. 비율이 아니라 허용 지연이 사전 계산의 가능 여부를 정합니다.

Q.팬아웃을 이번 범위에서 빼는 이유가 무엇입니까

글을 퍼뜨리는 문제와 순서를 정하는 문제가 다르기 때문입니다.

팬아웃은 글 하나를 팔로워들의 목록에 어떻게 넣을지의 문제입니다. 순서는 그 목록을 무슨 기준으로 늘어놓을지의 문제입니다. 둘을 섞으면 각각의 판단 근거가 흐려집니다.

이번에 함께 빼는 것들입니다.

무엇이 좋은 글인지 학습으로 정하기
광고와 추천 글 끼워 넣기
댓글과 좋아요 자체의 저장

흔한 실수: 범위를 적지 않는 것. 적어 두지 않으면 설계 도중에 "학습 모델을 쓰면 되지 않나" 같은 갈래가 계속 끼어들고, 어느 것도 끝내지 못합니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

뉴스 피드 시스템 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.