본문 바로가기

SpringBoot

Kafka를 이용해서 인기글 서비스를 어떻게 구현할 수 있을까?

실시간 인기글 서비스, Kafka로 어떻게 만들까요?

0. 목표 한 줄 요약

  • 일 단위 상위 10건 인기글을 매일 오전 1시에 제공해요.
  • 점수 공식은 (좋아요 × 3) + (댓글 × 2) + (조회수 × 1) 예요.
  • 최근 7일만 유지하면 충분해요.
  • 대용량 트래픽에서도 빠르고 안전하게 동작하도록 Kafka + Redis 기반 스트림 처리로 구현해요.

1. 배경과 문제 정의

1-1. 단순 배치로는 왜 아쉬울까요?

배치로도 다음 순서로 구현할 수 있어요.

  1. 자정 이후 전날 게시글 전수 스캔
  2. 좋아요/댓글/조회수 조회
  3. 점수 계산
  4. 상위 10건 선정

하지만 이런 문제가 생겨요.

  • 데이터가 매우 많으면 1시간 내 처리가 빡빡해져요.
  • 00:10에 노출해야 한다”처럼 정책이 바뀌면 유연하지 않아요.
  • 좋아요/조회수/댓글이 각각 다른 마이크로서비스에 흩어져 있어 자정~1시 동안 타 서비스 부하가 폭증할 수 있어요.
  • 병렬 처리를 늘리면 설계·운영 복잡도인프라 비용이 커져요.

1-2. 그래서 "스트림" 처리를 선택했어요.

  • 게시글/댓글/좋아요/조회수의 변경 이벤트를 실시간 수집해요.
  • 들어오는 대로 점수를 갱신하고 상위 10건을 항상 최신 상태로 유지해요.
  • 자정이 지나면 “어제” 키로 만들어둔 랭킹을 그대로 노출하면 돼요. 배치가 사실상 필요 없어요.

2. 전체 아키텍처 한눈에 보기

  • 소스 서비스(게시글/댓글/좋아요/조회수)Kafka(토픽: article/comment/like/view)인기글 서비스(Consumer)Redis Sorted Set에 Top10 유지클라이언트 제공
  • 이게 바로 이벤트 드리븐 아키텍처(EDA)예요.
  • 조회수 이벤트는 트래픽이 크므로 n건 단위(100회정도)로 묶어서 보낼 수 있어요.
  • 정확성이 크게 중요치 않다면 비용 대비 효율이 좋아요.

 


 

이번 설계는 배치를 대체하는 게 목적이 아니고, 자주 변하는 “인기글”을 실시간에 가깝게 준비하려는 전략이에요.
Kafka로 안정적으로 이벤트를 중개하고, Redis Sorted Set으로 빠르게 Top10을 유지하면, 사용자는 매일 01시에 지연 없이 결과를 볼 수 있어요.