DEVELOPMENT NOTE / Modu Square
인기글 트래픽 집중에 따른 응답 지연 개선
문제
- 인기글 목록은 다른 기능보다 조회 트래픽이 집중되기 쉬움

- Redis에는 인기글 ID와 점수만 있어 목록 요청마다 Article Service의 단건 조회 API를 10회 호출
return hotArticleListRepository.readAll(dateStr).stream()
.map(articleClient::read)
.filter(Objects::nonNull)
.map(HotArticleResponse::from)
.toList();
- 요청률을 높이자 75 req/s까지 20ms대였던 응답 시간이 100 req/s에서 1초 이상으로 급증
- 이 호출이 Article Service와 MySQL까지 이어지며 대기 시간 증가
부하 테스트
같은 로컬 환경에서 요청률을 단계적으로 높여 적용 전후 비교.
| 항목 | 설정 |
|---|---|
| 대상 | 당일 생성 게시글 Top 10 |
| 부하 방식 | k6 constant-arrival-rate |
| 요청률 | 50 → 75 → 100 → 150 → 200 → 250 req/s |
| 측정 시간 | 단계별 45초 |
변경 전 확인

- 100 req/s부터 p95·p99가 초 단위로 급증하며 병목 구간 확인
Redis 조회 모델 적용
인기글 화면에 필요한 articleId, title, createdAt만 당일 생성 게시글에 한해 Redis에 별도로 저장.
List<Long> articleIds = hotArticleListRepository.readAll(dateStr);
Map<Long, HotArticleQueryModel> queryModels =
hotArticleQueryModelRepository.readAll(articleIds);
- Sorted Set에서 Top 10 ID를 읽은 뒤
MGET한 번으로 화면 데이터 조회 - 조회 대상이 될 수 있는 게시글의 생성·수정 이벤트를 조회 모델에 반영하고 삭제 이벤트는 즉시 제거

- 100 req/s에서 p95 1.75ms 확인
- 같은 조건에서 250 req/s까지 높여도 오류와 미실행 요청 없이 처리
개선 결과
| 지표 | 변경 전 100 req/s | 적용 후 100 req/s | 적용 후 250 req/s |
|---|---|---|---|
| p95 | 1.83s | 1.75ms | 1.21ms |
| Article Service 단건 조회 | 최대 약 993 req/s | 0 req/s | 0 req/s |