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

누구 것을 미리 만드나

전체를 미리 만들면 대부분이 버려진다

앞 절에서 시간과 무관한 점수는 미리 계산하기로 했습니다. 그러면 누구의 피드를 미리 만드는지가 다음 결정입니다.

전체를 미리 만들면 5분의 4가 버려진다

가입자 전체의 피드를 미리 만들면 대부분이 읽히지 않고 버려진다 가입 5천만 일간 활성 1천만 나머지 4천만은 오늘 피드를 열지 않는다 전체 것을 미리 만들면 5분의 4가 읽히지 않고 버려진다 활성 사용자 것만 미리 만들고 나머지는 열 때 만든다 경계에서 생기는 일 오래 안 오던 사용자의 첫 조회는 느리다. 그것을 감수한다 활성 판정이 틀리면 느린 첫 조회가 늘어난다. 넉넉하게 잡는다

가입자는 5천만이고 오늘 피드를 여는 사람은 1천만입니다. 전체 것을 미리 만들면 5분의 4는 아무도 읽지 않습니다.

대상미리 만들기
자주 오는 사용자미리 만든다. 바로 꺼내 준다
오래 안 오는 사용자만들지 않는다. 열 때 만든다

이 구분은 요구사항의 두 숫자에서 바로 나옵니다. 가입자 수와 일간 활성 수의 차이가 크지 않다면 나눌 이유가 없습니다.

나누면 무엇을 감수하나

미리 만들지 않은 사용자의 첫 조회는 느립니다. 후보를 모으고 점수를 매기는 것을 그 자리에서 해야 합니다.

자주 오는 사람은 늘 빠르다
오래 안 오던 사람은 첫 화면만 느리다

이것은 받아들일 만한 거래입니다. 오래 안 오던 사용자는 그 한 번의 지연을 크게 느끼지 않고, 그 뒤로는 활성으로 분류되어 빨라집니다.

대신 활성 판정이 틀리면 느린 첫 조회가 늘어납니다. 그래서 판정을 넉넉하게 잡습니다. 어제 왔던 사람만 활성으로 보면 하루 쉰 사람이 매번 느려집니다. 며칠 안에 온 적이 있으면 활성으로 두는 편이 안전합니다.

미리 만든 것을 언제 갱신하나

미리 만들어 둔 피드는 시간이 지나면 낡습니다. 갱신 방법이 두 갈래입니다.

방법성질
새 글이 올라오면 관련된 피드를 갱신반영이 빠르다. 작성량에 비례해 일이 생긴다
일정 주기로 다시 만들기일이 예측 가능하다. 5분 안에 들어오도록 주기를 잡는다

요구사항이 5분을 허용하므로 주기적 갱신으로 충분합니다. 그리고 주기적 갱신은 작성량이 갑자기 늘어도 우리 쪽 일이 늘지 않습니다.

다만 사용자가 방금 올린 자기 글은 예외입니다. 자기 글이 안 보이면 올리기가 실패한 것으로 느끼므로, 자기 글은 갱신을 기다리지 않고 앞에 끼워 넣습니다.

저장 크기를 계산한다

활성 1천만 명에게 후보 수백 건의 목록을 들고 있으면 얼마인지 봅니다.

1천만 x 수백 건 x 글 식별자 몇 바이트
= 수십 GB 규모

글 본문을 넣지 않고 식별자와 점수만 두면 이 정도입니다. 본문까지 넣으면 수백 배가 되고, 본문은 여러 사용자의 피드에 같은 것이 들어가므로 중복입니다. 피드에는 참조만 두고 본문은 따로 읽습니다.

면접에서 이렇게 나옵니다

Q.가입자 전체의 피드를 미리 만들어 두면 무엇이 문제입니까

5분의 4가 읽히지 않고 버려집니다.

가입자는 5천만이고 오늘 피드를 여는 사람은 1천만입니다.

대상미리 만들기
자주 오는 사용자미리 만든다
오래 안 오는 사용자열 때 만든다

이 구분은 요구사항의 두 숫자에서 바로 나옵니다. 가입자 수와 활성 수의 차이가 크지 않다면 나눌 이유가 없습니다.

흔한 실수: 활성 판정을 너무 좁게 잡는 것. 어제 온 사람만 활성으로 보면 하루 쉰 사람이 매번 느린 첫 조회를 겪습니다. 며칠 안에 온 적이 있으면 활성으로 두는 편이 안전합니다.

Q.미리 만든 피드를 어떻게 갱신하시겠습니까

주기적으로 다시 만듭니다. 요구사항이 5분 지연을 허용합니다.

방법성질
새 글마다 관련 피드 갱신반영이 빠르다. 작성량에 비례해 일이 생긴다
일정 주기로 다시 만들기일이 예측 가능하다

주기적 갱신은 작성량이 갑자기 늘어도 우리 쪽 일이 늘지 않는다는 이점이 있습니다.

흔한 실수: 자기 글도 갱신을 기다리게 하는 것. 올린 직후 자기 글이 안 보이면 사용자는 올리기가 실패한 것으로 느낍니다. 자기 글은 갱신과 무관하게 앞에 끼워 넣습니다.

Q.미리 만든 피드에 글 본문을 담으시겠습니까

식별자와 점수만 담고 본문은 따로 읽습니다.

1천만 x 수백 건 x 식별자 몇 바이트 = 수십 GB 규모

본문까지 넣으면 수백 배가 됩니다. 그리고 인기 있는 글의 본문은 수많은 사용자의 피드에 같은 내용으로 중복 저장됩니다.

본문은 글 하나당 한 벌만 두고 여러 피드가 참조합니다. 글이 수정되거나 삭제될 때도 한 곳만 고치면 됩니다.

흔한 실수: 읽기를 한 번으로 줄이려고 본문을 넣는 것. 읽기 횟수는 줄지만 저장이 수백 배가 되고, 글 수정과 삭제가 모든 피드를 고치는 일로 바뀝니다.

Q.오래 안 오던 사용자의 첫 조회가 느린 것은 괜찮습니까

받아들일 만한 거래입니다. 자주 오는 사람은 늘 빠르고, 오래 안 오던 사람만 첫 화면이 느립니다.

응답 시간 요구는 상위 1퍼센트가 200ms 이내입니다. 활성 사용자가 조회의 대부분을 만들므로, 비활성 사용자의 첫 조회는 그 1퍼센트 안에 들어갑니다.

그 뒤로는 활성으로 분류되어 빨라집니다.

흔한 실수: 이 지연을 숨기려고 빈 화면을 먼저 주는 것. 사용자는 피드가 비었다고 오해합니다. 만들고 있다는 것을 보여주는 편이 낫고, 그 사이에 값싼 후보만으로 일부를 먼저 보여줄 수도 있습니다.

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

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

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