앞 절에서 순서를 점수로 정하기로 했습니다. 그러면 점수를 무엇에 대해 계산하는지가 문제가 됩니다. 팔로우 평균 200개의 최근 글을 다 모으면 수천 건이고, 응답 시간은 상위 1퍼센트가 200ms 이내여야 합니다.
수천 건에 비싼 점수를 매길 수 없다
점수를 제대로 매기려면 글마다 여러 값을 봐야 합니다. 작성자와의 친밀도, 반응 수, 내용 종류, 사용자가 최근 무엇을 눌렀는지. 이것을 수천 건에 하면 200ms 안에 끝나지 않습니다.
그래서 두 단계로 나눕니다.
| 단계 | 하는 일 | 비용 |
|---|---|---|
| 후보 생성 | 값싼 기준으로 수백 건까지 줄인다 | 낮다 |
| 순위 매기기 | 그 수백 건에만 비싼 점수를 매긴다 | 높지만 대상이 적다 |
첫 화면이 20개이므로 후보가 수백 건이면 충분합니다. 20개를 뽑기 위해 수천 건을 다 볼 필요가 없습니다.
후보는 무엇으로 고르나
값싼 기준이란 미리 정렬해 둘 수 있는 것입니다.
최근에 올라온 것부터 일정 개수
반응이 많은 것부터 일정 개수
자주 보는 계정의 글부터 일정 개수
세 목록을 각각 얻어 합칩니다. 각 목록은 미리 만들어 둘 수 있으므로 꺼내기만 하면 됩니다.
한 기준만 쓰면 그 기준의 편향이 그대로 남습니다. 최근성만 쓰면 시간순 피드의 문제가 후보 단계에서 재현되고, 반응 수만 쓰면 큰 계정의 글만 후보가 됩니다. 여러 목록을 합치는 것이 이것을 막습니다.
거르는 단계에서 놓치면 못 살린다
두 단계로 나누면 새 위험이 생깁니다. 후보에 들어오지 못한 글은 순위를 아무리 잘 매겨도 보이지 않습니다.
| 놓치는 경우 | 결과 |
|---|---|
| 조용한 계정의 좋은 글 | 반응 수 기준에 못 들고 최근성에서도 밀린다 |
| 조금 오래된 글 | 최근성 기준에서 빠진다 |
그래서 후보 목록 하나에는 일부러 다른 기준을 넣습니다. 예를 들어 최근 상호작용이 있었던 계정의 글을 반응 수와 무관하게 일정 개수 넣습니다.
후보 단계의 품질을 따로 재야 합니다. 최종 화면만 보면 순위 문제인지 후보 문제인지 구분할 수 없습니다. 보여준 20개가 후보 수백 개 중 어디에서 왔는지 기록해 두면, 어느 목록이 쓸모없는지 알 수 있습니다.
두 단계가 실패를 다르게 만든다
각 단계가 느려지거나 실패했을 때 할 수 있는 것이 다릅니다.
| 실패 | 대응 |
|---|---|
| 순위 매기기가 느리다 | 후보를 값싼 기준 순서로 그냥 보여준다 |
| 후보 생성이 실패한다 | 보여줄 것이 없다 |
순위는 없어도 피드가 나가지만 후보는 없으면 빈 화면입니다. 그래서 후보 목록은 여러 벌 두고 하나가 없어도 나머지로 만들고, 순위 계산에는 시간 제한을 걸어 넘긴 만큼만 반영합니다.