실시간 인기글 서비스, Kafka로 어떻게 만들까요?
0. 목표 한 줄 요약
- 일 단위 상위 10건 인기글을 매일 오전 1시에 제공해요.
- 점수 공식은 (좋아요 × 3) + (댓글 × 2) + (조회수 × 1) 예요.
- 최근 7일만 유지하면 충분해요.
- 대용량 트래픽에서도 빠르고 안전하게 동작하도록 Kafka + Redis 기반 스트림 처리로 구현해요.
1. 배경과 문제 정의
1-1. 단순 배치로는 왜 아쉬울까요?
배치로도 다음 순서로 구현할 수 있어요.
- 자정 이후 전날 게시글 전수 스캔
- 좋아요/댓글/조회수 조회
- 점수 계산
- 상위 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시에 지연 없이 결과를 볼 수 있어요.
'SpringBoot' 카테고리의 다른 글
| [Spring Batch] JobParameters와 Scope (0) | 2025.12.15 |
|---|---|
| [Spring Batch] Tasklet vs Chunk 간단 정리 (0) | 2025.12.15 |
| 분산 이벤트 스트리밍 플랫폼, Kafka 아는척해보기 (3) | 2025.08.17 |
| Swagger를 사용해서 쉽게 api명세서를 만들어보자! (2) | 2024.12.01 |
| Springboot에서 SMTP(google)를 통해 인증번호를 보내보자! (1) | 2024.11.29 |