DEVELOPMENT NOTE / Modu Square

인기글 트래픽 집중에 따른 응답 지연 개선

문제

  • 인기글 목록은 다른 기능보다 조회 트래픽이 집중되기 쉬움

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
p951.83s1.75ms1.21ms
Article Service 단건 조회최대 약 993 req/s0 req/s0 req/s