본 프로젝트는 Spring Boot와 MySQL을 활용한 모의 면접 서비스입니다.
이 글은 조회 API에서 조회수를 업데이트할 때 Redis write back 패턴으로 성능을 개선한 사례를 다룹니다. 또한 Redis 장애 상황에 대한 fallback 처리 방법도 함께 설명합니다.
매번 DB에 증분 쿼리를 실행하는 대신 Redis에 조회수를 저장하고 주기적으로 DB와 동기화하는 write back 패턴을 도입했습니다. 그 결과 TPS를 84% 개선(186 TPS → 342 TPS)했습니다.
추가로 Redis timeout 설정과 장애 시 DB 직접 조회를 통한 fallback 처리로 조회 API의 안정성을 보장했습니다.
조회수 기능을 구현하는 과정에서 조회 API에 조회수를 업데이트 하는 로직이 필요했습니다. 단순히 다음과 같은 증분 쿼리를 사용해도 되지만 트래픽 급증 시 성능 저하 문제가 있을 수 있습니다.
(JPA의 Dirty Checking은 race condition 때문에 제외하였습니다.)
UPDATE interview SET view_count = view_count + 1 WHERE id = ?
MySQL에서 UPDATE 문으로 인해 레코드 락이 걸리기 때문에 같은 interview에 대해 조회 트래픽이 급증하면 X 락 대기로 성능이 저하될 수 있습니다.
특히 조회 API에서 쓰기로 인한 성능 저하 문제는 피해야 한다고 생각했습니다.