앞 절에서 시간과 무관한 점수는 미리 계산하기로 했습니다. 그러면 누구의 피드를 미리 만드는지가 다음 결정입니다.
전체를 미리 만들면 5분의 4가 버려진다
가입자는 5천만이고 오늘 피드를 여는 사람은 1천만입니다. 전체 것을 미리 만들면 5분의 4는 아무도 읽지 않습니다.
| 대상 | 미리 만들기 |
|---|---|
| 자주 오는 사용자 | 미리 만든다. 바로 꺼내 준다 |
| 오래 안 오는 사용자 | 만들지 않는다. 열 때 만든다 |
이 구분은 요구사항의 두 숫자에서 바로 나옵니다. 가입자 수와 일간 활성 수의 차이가 크지 않다면 나눌 이유가 없습니다.
나누면 무엇을 감수하나
미리 만들지 않은 사용자의 첫 조회는 느립니다. 후보를 모으고 점수를 매기는 것을 그 자리에서 해야 합니다.
자주 오는 사람은 늘 빠르다
오래 안 오던 사람은 첫 화면만 느리다
이것은 받아들일 만한 거래입니다. 오래 안 오던 사용자는 그 한 번의 지연을 크게 느끼지 않고, 그 뒤로는 활성으로 분류되어 빨라집니다.
대신 활성 판정이 틀리면 느린 첫 조회가 늘어납니다. 그래서 판정을 넉넉하게 잡습니다. 어제 왔던 사람만 활성으로 보면 하루 쉰 사람이 매번 느려집니다. 며칠 안에 온 적이 있으면 활성으로 두는 편이 안전합니다.
미리 만든 것을 언제 갱신하나
미리 만들어 둔 피드는 시간이 지나면 낡습니다. 갱신 방법이 두 갈래입니다.
| 방법 | 성질 |
|---|---|
| 새 글이 올라오면 관련된 피드를 갱신 | 반영이 빠르다. 작성량에 비례해 일이 생긴다 |
| 일정 주기로 다시 만들기 | 일이 예측 가능하다. 5분 안에 들어오도록 주기를 잡는다 |
요구사항이 5분을 허용하므로 주기적 갱신으로 충분합니다. 그리고 주기적 갱신은 작성량이 갑자기 늘어도 우리 쪽 일이 늘지 않습니다.
다만 사용자가 방금 올린 자기 글은 예외입니다. 자기 글이 안 보이면 올리기가 실패한 것으로 느끼므로, 자기 글은 갱신을 기다리지 않고 앞에 끼워 넣습니다.
저장 크기를 계산한다
활성 1천만 명에게 후보 수백 건의 목록을 들고 있으면 얼마인지 봅니다.
1천만 x 수백 건 x 글 식별자 몇 바이트
= 수십 GB 규모
글 본문을 넣지 않고 식별자와 점수만 두면 이 정도입니다. 본문까지 넣으면 수백 배가 되고, 본문은 여러 사용자의 피드에 같은 것이 들어가므로 중복입니다. 피드에는 참조만 두고 본문은 따로 읽습니다.