설계 면접 문제 11 · 4부 많아지면

인기글 좋아요순 정렬 설계 면접: 100만 글을 매번 세면 생기는 일

시스템 디자인 Vol.1 · 11장 「좋아요 수로 줄 세우는 인기글」에서

이런 화면입니다

커뮤니티 인기 탭을 엽니다. 좋아요를 많이 받은 글이 위에서부터 줄을 서 있습니다.

글은 100만 건이고, 좋아요는 누가 어느 글에 눌렀는지가 한 줄씩 쌓여 있습니다. 인기 탭은 그 줄들을 세어야 나오는 순서입니다.

면접관이 이렇게 묻습니다

면접관

게시판에 인기 탭을 만듭니다. 좋아요 수가 많은 순으로 보여 줍니다. 글이 100만 건이고, 좋아요는 likes 테이블에 행으로 쌓여 있습니다. 설계해 보세요.

범위부터 좁힙니다

한 줄로 좁힙니다. 좋아요 수가 많은 순으로 글 목록을 내려 주고, 각 글의 좋아요 수도 같이 보여 준다. 실시간 급상승은 접고 많은 순 하나에 집중합니다.

이 문제의 무게

인기 탭 한 번의 비용이 무엇에 비례하는지가 핵심 질문입니다.

가장 많이 나오는 답

정렬할 때마다 글별로 좋아요를 셉니다.

SELECT p.id, p.title, COUNT(l.user_id) AS likes
FROM   posts p
LEFT   JOIN likes l ON l.post_id = p.id
GROUP  BY p.id
ORDER  BY likes DESC
LIMIT  20;

글 몇백 개로 시험하면 금방 나옵니다.

그런데 여기서 깨집니다

인기 탭을 한 번 열 때마다 100만 글의 좋아요를 전부 셉니다. 보여 주는 건 20개인데 세는 건 전체입니다. 사용자가 늘수록 같은 셈을 끝없이 반복합니다.

인기 탭은 첫 화면에 걸려 있습니다. 가장 많이 열리는 화면이 가장 비싼 쿼리를 부르는 셈입니다.

떨어지는 답은 이런 모양입니다

  • GROUP BY로 세는 쿼리로 끝냅니다.
  • 느려지면 서버를 늘리겠다고 답합니다.
  • 인기 탭이 열릴 때마다 무엇을 세는지 설명하지 못합니다.

면접관은 여기서 멈추지 않습니다

  1. 목록에 댓글 수도 보여 줘야 하면요?

    같은 문제가 하나 더 붙을 때 설계가 늘어나는 방식을 봅니다.

  2. 「오늘의 인기글」이라면요?

    기간이 붙으면 세는 범위가 바뀐다는 것을 아는지 봅니다.

  3. 분 단위로 갱신되는 실시간 급상승 랭킹이라면요?

    정확도와 신선도 사이에서 무엇을 내줄지 말하는지 봅니다.

VOL.1 · 11장

이 다음 판단은 책에서 이어집니다

책은 인기 탭 한 번의 비용을 어떻게 줄일지 정하고, 그 선택이 다른 기능에 주는 영향까지 실제 요청 흐름으로 풉니다.

11장에서 이어지는 것

  • 인기 탭 한 번의 비용
  • 그 선택이 다른 기능에 주는 영향
  • 실제 요청이 흐르는 순서
시스템 디자인 Vol.1 보러 가기 →

매일 쓰는 화면에서 나온 설계 문제 22개 · 263쪽 · 현직 엔지니어와 30분 모의면접

22문제 전체 보기