Foundry
뉴스 피드 시스템 설계
심화
핵심

이미 본 것을 걸러내기

무엇을 얼마나 정확히 기억할지 정한다

앞 절에서 후보 묶음을 이어 붙일 때 이미 보여준 글이 다시 들어올 수 있다는 것을 봤습니다. 점수가 여전히 높은 글은 새 후보에도 뽑히기 때문입니다.

기록이 얼마나 쌓이나

본 것을 전부 기록하면 하루 수십억 건이 되므로 범위를 정해야 한다 하루에 쌓이는 기록 활성 1천만 x 하루 본 글 200개 하루 20억 건 한 사람의 기록을 다 들고 있으면 1년에 7만 건이 된다 두 가지를 정한다 얼마나 오래 기억하나 며칠. 그 기간이 곧 다시 안 보일 기간이다 얼마나 정확히 기억하나 틀려도 되는 판정이라 근사로 충분하다 잘못 걸러 안 보여 주는 쪽이 두 번 보여 주는 쪽보다 낫다

활성 사용자 1천만 명이 하루에 글 200개를 본다면 하루 20억 건입니다. 한 사람 것만 봐도 1년이면 7만 건입니다.

이 규모에서는 무엇을 얼마나 오래 기억할지 정해야 합니다. 다 들고 있겠다는 선택은 계산해 보면 선택이 아닙니다.

두 가지를 정한다

정할 것결정
얼마나 오래 기억하나며칠. 그 기간이 곧 다시 안 보일 기간이다
얼마나 정확히 기억하나틀려도 되는 판정이라 근사로 충분하다

기간을 정하는 것은 제품 결정입니다. 3일만 기억하면 나흘 전에 본 글이 다시 보일 수 있고, 그것을 사용자가 받아들일 만한지가 기준입니다.

정확도는 다릅니다. 이 판정은 틀려도 큰 손해가 없습니다.

틀리는 방향결과
안 본 것을 봤다고 판정좋은 글 하나를 놓친다
본 것을 안 봤다고 판정같은 글을 두 번 본다

두 번 보여주는 쪽이 더 나쁩니다. 사용자는 두 번 보이는 것을 곧바로 알아차리고 피드가 고장 났다고 느낍니다. 반면 하나 놓친 것은 알 수 없습니다. 그래서 놓치는 쪽으로 기울어진 판정을 씁니다. 확실하지 않으면 봤다고 처리합니다.

무엇을 본 것으로 세나

화면에 나타난 것과 사용자가 읽은 것은 다릅니다.

목록에 실려 내려간 것
화면에 잠깐 스친 것
멈춰서 읽은 것

셋을 같게 다루면, 빠르게 스크롤한 사용자가 읽지도 않은 글을 다시는 못 보게 됩니다. 그래서 화면에 일정 시간 머문 것만 본 것으로 셉니다.

이 판정을 클라이언트가 해서 알려줍니다. 서버는 무엇을 보냈는지만 알고 사용자가 어디까지 봤는지는 모릅니다.

기록을 어디에 두나

이 기록은 쓰기가 매우 많고 읽기는 짧은 목록 조회입니다. 하루 20억 건이 들어오고, 조회는 피드를 만들 때 한 번입니다.

사용자별로 최근 며칠분만 들고 있는 형태
오래된 것은 자동으로 사라지게 둔다

지우는 일을 따로 돌리지 않고 저장소가 알아서 버리게 하는 것이 중요합니다. 하루 20억 건을 지우는 배치는 그 자체로 부담입니다.

면접에서 이렇게 나옵니다

Q.본 글을 전부 기록하면 얼마나 쌓입니까

하루 20억 건입니다. 활성 1천만 명이 하루 200개를 본다고 보면 그렇습니다.

한 사람 것만 봐도 1년이면 7만 건입니다. 다 들고 있겠다는 선택은 계산해 보면 선택이 아닙니다.

정할 것결정
얼마나 오래 기억하나며칠
얼마나 정확히 기억하나근사로 충분하다

기간을 정하는 것이 곧 다시 안 보일 기간을 정하는 것입니다.

흔한 실수: 기간을 길게 잡는 것이 더 좋은 경험이라고 보는 것. 오래 기억하면 저장이 커지는 것뿐 아니라 보여줄 수 있는 글이 줄어듭니다. 팔로우가 적은 사용자는 피드가 비어 갑니다.

Q.본 것 판정이 틀릴 때 어느 방향이 나은가요

놓치는 쪽입니다. 확실하지 않으면 봤다고 처리합니다.

틀리는 방향결과
안 본 것을 봤다고 판정좋은 글 하나를 놓친다
본 것을 안 봤다고 판정같은 글을 두 번 본다

사용자는 두 번 보이는 것을 곧바로 알아차리고 피드가 고장 났다고 느낍니다. 반면 하나 놓친 것은 알 수 없습니다.

이 비대칭이 있어서 정확한 기록 대신 근사 판정을 쓸 수 있습니다.

흔한 실수: 정확도를 올리려고 기록을 정확하게 저장하는 것. 정확도의 이득은 놓치지 않는 것인데 그것은 사용자가 알아채지 못하는 이득입니다. 비용만 큽니다.

Q.무엇을 본 것으로 세시겠습니까

화면에 일정 시간 머문 것만 셉니다.

목록에 실려 내려간 것
화면에 잠깐 스친 것
멈춰서 읽은 것

셋을 같게 다루면 빠르게 스크롤한 사용자가 읽지도 않은 글을 다시는 못 보게 됩니다. 한 번의 빠른 스크롤로 그날의 좋은 글을 다 잃습니다.

판정은 클라이언트가 해서 알려줍니다. 서버는 무엇을 보냈는지만 알고 사용자가 어디까지 봤는지는 모릅니다.

흔한 실수: 서버가 보낸 것을 본 것으로 세는 것. 구현이 가장 쉽지만 첫 화면 20개를 보내고 사용자가 앱을 닫으면 그 20개를 영구히 잃습니다.

Q.본 것 기록을 어디에 어떻게 두시겠습니까

사용자별로 최근 며칠분만 들고, 오래된 것은 저장소가 알아서 버리게 둡니다.

이 기록은 쓰기가 매우 많고 읽기는 짧은 목록 조회입니다. 하루 20억 건이 들어오고 조회는 피드를 만들 때 한 번입니다.

지우는 일을 따로 돌리지 않고 저장소가 버리게 한다

하루 20억 건을 지우는 배치는 그 자체로 부담이 됩니다.

흔한 실수: 이 기록을 다른 목적으로도 쓰려는 것. 분석이나 통계에 쓰려면 오래 보관해야 하고, 그러면 만료로 버릴 수 없습니다. 걸러내기용 기록과 분석용 기록을 나눠 둡니다.

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

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

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