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

후보를 고르고 순위를 매긴다

비싼 계산의 대상을 먼저 줄인다

앞 절에서 순서를 점수로 정하기로 했습니다. 그러면 점수를 무엇에 대해 계산하는지가 문제가 됩니다. 팔로우 평균 200개의 최근 글을 다 모으면 수천 건이고, 응답 시간은 상위 1퍼센트가 200ms 이내여야 합니다.

수천 건에 비싼 점수를 매길 수 없다

수천 건에서 수백 건의 후보를 고르고 그 안에서만 순위를 매긴다 팔로우 200명의 최근 글에서 시작한다 수천 건 값싼 기준으로 걸러낸다 후보 수백 건 비싼 점수를 여기서만 계산한다 보여줄 20개 수천 건 전부에 비싼 점수를 매기면 200ms 안에 못 끝난다 단계를 나누면 비싼 계산의 대상이 수십 분의 일이 된다 거르는 단계에서 좋은 글을 떨어뜨리면 순위를 잘 매겨도 못 살린다

점수를 제대로 매기려면 글마다 여러 값을 봐야 합니다. 작성자와의 친밀도, 반응 수, 내용 종류, 사용자가 최근 무엇을 눌렀는지. 이것을 수천 건에 하면 200ms 안에 끝나지 않습니다.

그래서 두 단계로 나눕니다.

단계하는 일비용
후보 생성값싼 기준으로 수백 건까지 줄인다낮다
순위 매기기그 수백 건에만 비싼 점수를 매긴다높지만 대상이 적다

첫 화면이 20개이므로 후보가 수백 건이면 충분합니다. 20개를 뽑기 위해 수천 건을 다 볼 필요가 없습니다.

후보는 무엇으로 고르나

값싼 기준이란 미리 정렬해 둘 수 있는 것입니다.

최근에 올라온 것부터 일정 개수
반응이 많은 것부터 일정 개수
자주 보는 계정의 글부터 일정 개수

세 목록을 각각 얻어 합칩니다. 각 목록은 미리 만들어 둘 수 있으므로 꺼내기만 하면 됩니다.

한 기준만 쓰면 그 기준의 편향이 그대로 남습니다. 최근성만 쓰면 시간순 피드의 문제가 후보 단계에서 재현되고, 반응 수만 쓰면 큰 계정의 글만 후보가 됩니다. 여러 목록을 합치는 것이 이것을 막습니다.

거르는 단계에서 놓치면 못 살린다

두 단계로 나누면 새 위험이 생깁니다. 후보에 들어오지 못한 글은 순위를 아무리 잘 매겨도 보이지 않습니다.

놓치는 경우결과
조용한 계정의 좋은 글반응 수 기준에 못 들고 최근성에서도 밀린다
조금 오래된 글최근성 기준에서 빠진다

그래서 후보 목록 하나에는 일부러 다른 기준을 넣습니다. 예를 들어 최근 상호작용이 있었던 계정의 글을 반응 수와 무관하게 일정 개수 넣습니다.

후보 단계의 품질을 따로 재야 합니다. 최종 화면만 보면 순위 문제인지 후보 문제인지 구분할 수 없습니다. 보여준 20개가 후보 수백 개 중 어디에서 왔는지 기록해 두면, 어느 목록이 쓸모없는지 알 수 있습니다.

두 단계가 실패를 다르게 만든다

각 단계가 느려지거나 실패했을 때 할 수 있는 것이 다릅니다.

실패대응
순위 매기기가 느리다후보를 값싼 기준 순서로 그냥 보여준다
후보 생성이 실패한다보여줄 것이 없다

순위는 없어도 피드가 나가지만 후보는 없으면 빈 화면입니다. 그래서 후보 목록은 여러 벌 두고 하나가 없어도 나머지로 만들고, 순위 계산에는 시간 제한을 걸어 넘긴 만큼만 반영합니다.

면접에서 이렇게 나옵니다

Q.팔로우 200명의 최근 글 수천 건에 모두 점수를 매기면 무엇이 문제입니까

응답 시간 요구를 지킬 수 없습니다. 상위 1퍼센트가 200ms 이내여야 합니다.

제대로 된 점수는 글마다 친밀도, 반응 수, 내용 종류, 최근 행동을 봐야 합니다. 수천 건에 그것을 하면 시간이 남지 않습니다.

단계하는 일
후보 생성값싼 기준으로 수백 건까지 줄인다
순위 매기기그 수백 건에만 비싼 점수를 매긴다

첫 화면이 20개이므로 후보 수백 건이면 충분합니다.

흔한 실수: 점수 계산을 더 빠르게 만들어 해결하려는 것. 계산을 열 배 빠르게 해도 대상이 수천 건이면 여유가 없습니다. 대상을 줄이는 것이 계산을 빠르게 하는 것보다 크게 듣습니다.

Q.후보를 고르는 기준을 하나만 쓰면 어떻게 되나요

그 기준의 편향이 최종 화면에 그대로 남습니다.

최근성만 쓰면 시간순 피드의 문제가 후보 단계에서 재현된다
반응 수만 쓰면 큰 계정의 글만 후보가 된다

순위 매기기가 아무리 좋아도 후보에 없는 글은 보여줄 수 없습니다. 그래서 서로 다른 기준으로 만든 목록 여러 개를 합쳐 후보를 만듭니다.

목록마다 미리 정렬해 둘 수 있어서 꺼내는 비용은 낮습니다.

흔한 실수: 후보 단계를 단순한 전처리로 보는 것. 여기서 떨어진 글은 되돌릴 수 없으므로 후보 단계가 최종 품질의 상한을 정합니다. 순위 개선보다 후보 개선이 더 크게 듣는 경우가 많습니다.

Q.피드 품질이 나쁠 때 후보 문제인지 순위 문제인지 어떻게 구분하시겠습니까

보여준 글이 어느 후보 목록에서 왔는지 기록합니다.

최종 화면만 보면 구분할 수 없습니다. 20개가 전부 한 목록에서 왔다면 나머지 목록이 쓸모없다는 뜻이고, 좋은 글이 후보에 아예 없었다면 순위를 고쳐도 달라지지 않습니다.

보여준 20개가 후보 수백 개 중 어디에서 왔는지 남긴다

이 기록이 있으면 후보 목록을 늘릴지 순위 규칙을 고칠지 판단할 수 있습니다.

흔한 실수: 후보 단계의 품질 지표를 따로 두지 않는 것. 최종 지표만 보면 개선이 어디서 왔는지도 알 수 없어서, 효과 없는 변경을 계속 쌓게 됩니다.

Q.순위 계산이 느려지면 피드를 어떻게 보여주시겠습니까

후보를 값싼 기준 순서로 그냥 보여줍니다. 순위는 없어도 피드가 나갑니다.

두 단계의 실패는 무게가 다릅니다.

실패대응
순위 매기기가 느리다후보 순서로 보여준다
후보 생성이 실패한다보여줄 것이 없다

그래서 순위 계산에는 시간 제한을 걸어 끝난 만큼만 반영하고, 후보 목록은 여러 벌 둬서 하나가 없어도 나머지로 만듭니다.

흔한 실수: 두 단계에 같은 수준의 안전장치를 두는 것. 후보는 빈 화면을 만들므로 더 두텁게 지켜야 하고, 순위는 품질이 조금 낮아지는 것으로 끝납니다. 무게가 다르면 대비도 달라야 합니다.

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

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

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