Skip to content

[Problem & Solving] 게시판 성능 향상을 위한 캐싱

gotoERROR00111011 edited this page Dec 5, 2022 · 3 revisions

문제 상황

부하 테스트 도구(Python-Locust)를 사용해 게시판 api에 대량의 요청을 보낼 경우 급격하게 응답 시간이 길어지고, timeout 까지 발생하였습니다.
서버의 실시간 응답 상태를 확인한 결과 DB query에 대한 응답 속도의 문제인것을 확인했습니다.

게시판 api는 각각의 요청이 여러개의 결과를 포함하고, 이러한 요청이 반복적으로 생기기 때문에 DB에 부담이 커지게 된다고 판단하였습니다.

해결 방안

게시판 api 요청에 대한 응답을 redis에 캐싱하여 DB 접근을 줄여서 해결합니다.
DB 접근 자체가 줄어들기 때문에 DB에 몰리는 부담을 해결할 수 있습니다.

또한 다음과 같은 이유로 속도 그 자체의 향상도 얻을 수 있습니다.
게시판의 경우 여러명의 사용자가 같은 데이터, 같은 페이지를 보는 경우가 많습니다.
예를들어 다음과 3가지 같은 경우와 몇가지의 조합으로 한정됩니다.

  1. 아무 조건도 없는 기본 페이지
  2. 태그를 조건으로 필터링이 된 경우
  3. 오름차순, 내림차순 정렬

따라서 같은 조건의 query string을 key로, DB 검색 결과를 value로 redis에 캐싱하여 DB 접근 자체를 줄일 수 있습니다.

하지만 제목검색은 경우의 수가 너무 많기 때문에 같은 키워드로 재검색이 행해질 가능성이 낮습니다.
따라서 제목검색은 캐싱을 사용하지 않는것이 유효할것이라 판단합니다.

실제 적용

결과

캐싱 여부에 따른 성능 차이는 확실하게 확인이 가능했습니다.
초당요청수는 100:1000, 응답시간은 1000:80 정도로 10배에 가까운 차이를 확인할 수 있었습니다.
또한 캐싱을 안했을 경우 초당요청수, 응답시간이 처음부터 급격하게 상승하여 한계치에 도달하는 것을 확인할 수 있었습니다.

No Cache Cache
RPS RPS Cache
Response Time Response Time Cache

마찬가지로 같은 게시판에서 캐싱을 사용하지 않는, title 검색 기능의 경우와의 성능 차이를 확인할 수 있습니다. locust

Home

규칙

프로젝트 계획

스프린트 회의록

데일리 스크럼

week 1
week 2
week 3
week 4
week 5
week 6

회고록

데모

Problem & Solving

Clone this wiki locally