앞 절에서 후보 묶음을 이어 붙일 때 이미 보여준 글이 다시 들어올 수 있다는 것을 봤습니다. 점수가 여전히 높은 글은 새 후보에도 뽑히기 때문입니다.
기록이 얼마나 쌓이나
활성 사용자 1천만 명이 하루에 글 200개를 본다면 하루 20억 건입니다. 한 사람 것만 봐도 1년이면 7만 건입니다.
이 규모에서는 무엇을 얼마나 오래 기억할지 정해야 합니다. 다 들고 있겠다는 선택은 계산해 보면 선택이 아닙니다.
두 가지를 정한다
| 정할 것 | 결정 |
|---|---|
| 얼마나 오래 기억하나 | 며칠. 그 기간이 곧 다시 안 보일 기간이다 |
| 얼마나 정확히 기억하나 | 틀려도 되는 판정이라 근사로 충분하다 |
기간을 정하는 것은 제품 결정입니다. 3일만 기억하면 나흘 전에 본 글이 다시 보일 수 있고, 그것을 사용자가 받아들일 만한지가 기준입니다.
정확도는 다릅니다. 이 판정은 틀려도 큰 손해가 없습니다.
| 틀리는 방향 | 결과 |
|---|---|
| 안 본 것을 봤다고 판정 | 좋은 글 하나를 놓친다 |
| 본 것을 안 봤다고 판정 | 같은 글을 두 번 본다 |
두 번 보여주는 쪽이 더 나쁩니다. 사용자는 두 번 보이는 것을 곧바로 알아차리고 피드가 고장 났다고 느낍니다. 반면 하나 놓친 것은 알 수 없습니다. 그래서 놓치는 쪽으로 기울어진 판정을 씁니다. 확실하지 않으면 봤다고 처리합니다.
무엇을 본 것으로 세나
화면에 나타난 것과 사용자가 읽은 것은 다릅니다.
목록에 실려 내려간 것
화면에 잠깐 스친 것
멈춰서 읽은 것
셋을 같게 다루면, 빠르게 스크롤한 사용자가 읽지도 않은 글을 다시는 못 보게 됩니다. 그래서 화면에 일정 시간 머문 것만 본 것으로 셉니다.
이 판정을 클라이언트가 해서 알려줍니다. 서버는 무엇을 보냈는지만 알고 사용자가 어디까지 봤는지는 모릅니다.
기록을 어디에 두나
이 기록은 쓰기가 매우 많고 읽기는 짧은 목록 조회입니다. 하루 20억 건이 들어오고, 조회는 피드를 만들 때 한 번입니다.
사용자별로 최근 며칠분만 들고 있는 형태
오래된 것은 자동으로 사라지게 둔다
지우는 일을 따로 돌리지 않고 저장소가 알아서 버리게 하는 것이 중요합니다. 하루 20억 건을 지우는 배치는 그 자체로 부담입니다.