-
Notifications
You must be signed in to change notification settings - Fork 8
사용자 증가 시 발생할 수 있는 문제 상황과 개선 방안
김경미 edited this page Oct 24, 2024
·
9 revisions
- 사용자가 만 명 이상이라고 가정한다.
시스템이 한정된 리소스 안에서 처리할 수 있는 용량을 넘어서게 되어, 요청에 대한 응답 시간이 길어지거나 에러가 발생하는 상황
- 읽기 작업 집중: 코드잽의 대부분 API가 읽기 연산에 집중되어 있기 때문에, DB가 처리할 수 있는 읽기 요청의 한계에 도달할 수 있다.
- 네트워크 지연: 사용자가 해외에서 접속할 때, 데이터가 멀리서 전송되면서 응답 시간이 길어질 수 있다.
- 로그 과다 생성: 불필요한 로그가 많이 쌓여 로그 처리에 리소스가 많이 소비되면서 성능에 악영향을 줄 수 있다.
- 읽기 전용 DB 증설: 읽기 요청을 분산하여 성능을 개선한다.
- 해외 AZ 및 CDN 활용: 해외 사용자가 가까운 지역에서 더 빠르게 데이터를 받을 수 있도록 한다.
- 로그 최적화: 불필요한 로그는 제거하고, 필요한 메시지만 기록하여 시스템 자원 소비를 줄인다.
시스템이 더 많은 사용자나 데이터, 요청을 처리하기 위해 유연하게 리소스를 늘리거나 조정할 수 있는 능력
확장성이 부족하면 시스템이 일정 수준 이상의 부하를 감당하지 못하고 성능이 급격히 저하된다
- 사용자 증가: 한정된 서버와 DB 용량으로는 급격히 증가하는 사용자 수를 감당할 수 없게 되는 상황을 말한다.
- 모니터링 및 로그 관리 부족: 사용자와 요청이 증가할 때, 모니터링과 로그 관리 시스템이 적절하게 확장되지 않으면 시스템 상태를 제대로 파악하지 못하고 장애를 초래할 수 있다.
- 서버와 DB의 Scale out & Scale up: 수평적, 수직적 확장을 통해 시스템이 증가하는 사용자 수와 데이터 요청을 처리할 수 있도록 한다.
- 다중 AZ 분산: 시스템을 여러 지역으로 분산 배치하여 가용성을 높이고, 동시에 확장성을 강화한다.
- 로그 용량 관리: 로그 관리 시스템도 함께 확장 가능하도록 하여 리소스 소모를 효율적으로 통제한다.
DB 복제가 지연될 때, 최신 데이터를 조회하지 못하거나 잘못된 데이터를 반환하는 문제
템플릿 생성 후 복제 지연 발생 시 다음 페이지에서 생성된 템플릿이 조회되지 않을 수 있다.
-
템플릿 상세 페이지:
- 사용자가 템플릿을 생성한 후, 자동으로 템플릿 상세 페이지로 리다이렉트된다.
- 이때
READER DB
에서 조회 요청을 처리하는데, 복제 지연이 발생하면 생성한 템플릿이 제대로 조회되지 않을 수 있다.
-
구경가기 페이지:
- 사용자가 템플릿을 생성한 후
구경가기
페이지로 이동하면 기본 정렬이최신순
으로 설정되어 있다. - 복제 지연으로 인해 방금 생성한 템플릿이 최신순 목록에 표시되지 않을 수 있다.
- 사용자가 템플릿을 생성한 후
- 글로벌 캐시 저장: 템플릿 생성 시, 해당 템플릿 데이터를 글로벌 캐시에 저장하여 복제 지연 동안 최신 데이터를 제공한다.
- 캐시 만료 설정: 캐시 비용 절감을 위해 일정 시간이 지나면 캐시 데이터를 비워 비용을 관리한다.
- 구경가기 캐시 사용: 첫 페이지에 진입할 때, 캐시 서버에서 최신 템플릿 목록을 조회하여 복제 지연 문제를 완화한다.
-
좋아요 순 정렬 변경: 사용자가 많아진 경우 기본 정렬을 "좋아요 순"으로 변경한다.
- 상위 데이터는 변경이 적어 캐싱이 용이하고, 복제 지연 문제를 겪을 가능성이 줄어든다.
복제 지연 문제는 캐시를 활용해 해결하고, 비용 효율성을 고려하여 캐시를 적절히 관리한다.
문제 상황
- 사용자가 템플릿을 생성함.
- 자동으로 템플릿 상세 페이지로 리다이렉트 됨
- 템플릿 상세 페이지 조회 요청은 READER DB 가 처리하기 때문에 복제 지연 발생이 발생할 경우 잘못된 요청 처리된다.
해결 방법
- 템플릿을 생성할 경우 새로 생성된 템플릿에 대한 데이터를 글로벌 캐시에 저장한다.
- 캐시는 비용이 비싸기 때문에 일정 시간이 지날 경우 비운다.
문제 상황 2
- 사용자가 템플릿을 생성함.
- 구경가기로 이동한 경우 디폴트 정렬은 "최신순" 이나, 복제 지연이 발생하여 자신이 생성한 템플릿이 보이지 않는다.
해결 방법
- 사용자가 충분히 많아진 경우 좋아요 순 정렬을 기본값으로 변경한다.
- 좋아요 순 정렬의 경우 가장 상위의 데이터는 변경이 적어 캐싱이 쉽다.
- 최신순에 비해 복제 지연을 확인할 가능성이 낮아지고, 사용자 경험이 높아진다.
- 캐시는 비용이 비싸기 때문에 일정 시간이 지날 경우 비운다.
- 구경가기 첫 페이지에 진입할 경우, 캐시 서버에서 최신 조회된 템플릿들을 조회한다. +) 캐시는 비용이 비싸기 때문에 일정 시간이 지날 경우 비운다.
개선 이유
코드 템플릿은 도메인 특성상 생성/변경보다 조회가 훨씬 자주 일어난다. 변경이 자주 일어나지 않는 목록이 중복적으로 조회되어 쿼리가 발생하게 된다. DB 레플리케이션을 통해 Reader 인스턴스가 2개 있긴 하지만, 변경이 자주 일어나지 않는 템플릿들에 대해 계속해서 조회하는 것은 불필요하다.
개선 방법
분산 환경이기 때문에 캐시 서버를 두어 조회가 잦은 배너 검색 결과, 구경가기 결과에 대해 캐시를 적용한다.
문제 상황
- 키워드 검색은 프로젝트의 핵심 기능이지만, 성능이 느리다.
- 3초 이상 걸리는 응답 때문에 사용자 이탈이 발생할 수 있다.
해결 방법
- ES 를 사용하는 전문검색을 활용한다.
문제 상황
- 현재 좋아요 수는
template
테이블과Like
중간 테이블을 조인하여 계산하고 있다.- 템플릿, 좋아요 수가 많아질수록 좋아요 수의 집계가 더욱 오래 걸릴 것이며, 좋아요순 정렬에 많은 시간이 걸려 성능이 저하될 것이다.
해결 방법
Template
테이블에도 좋아요 수를 컬럼으로 가지도록 반정규화를 진행한다.- 좋아요 수가 적당히 많은 템플릿에 대해서는 좋아요 업데이트를 배치로 업데이트 한다.
- 로드밸런서에 대한 부하도 걱정됨
- 현재 1대의 로드밸런서만을 사용중이기 때문에 로드밸런서 자체가 과부하가 되는 경우 서비스 자체를 이용할 수 없게 됨.
- 이에 대한 해결책으로는 2대의 로드밸런서를 사용하고, DNS에서의 로드밸런싱 기술을 적용하는 것을 고려해볼 수 있음
- 백엔드 코드 컨벤션
- 백엔드 기술 스택 및 선정 이유
- 각종 인스턴스 설정 파일 및 구성 위치 가이드
- ERD (24.09.27)
- 백엔드 CI CD 동작 프로세스
- 로컬 DB 환경 설정
- 백엔드 로깅 전략
- 백엔드 로그 모니터링 구성도
- 스프링 메트릭 모니터링 구성도
- Flyway 로 스키마 관리
- 코드잽 서버 구성도
- Git Submodule 사용 메뉴얼
- 프론트엔드 코드 컨벤션
- 프론트엔드 기술 스택 및 선정 이유
- 프론트엔드 서비스 타겟 환경 및 브라우저 지원 범위 선정
- 프론트엔드 모니터링 및 디버깅 환경 구축
- 프론트엔드 테스트 목록
- 프론트엔드 라이브러리 기술 검토
- 프론트엔드 개발서버, 운영서버 빌드 및 배포 환경 구분
- 목표했던 타겟 환경과 디바이스에서 서비스 핵심 기능 동작 확인
- 프론트엔드 접근성 개선 보고서
- EC2 로그 확인 방법
- VSCode를 통한 EC2 인스턴스 SSH 연결 방법
- 터미널을 통한 EC2 인스턴스 SSH 연결 방법
- NGINX 설정 파일 접근 및 적용 방법
- DB 접속 및 백업 방법
- [QA] 배포 전 체크리스트
- CI 파이프라인 구축
- CD 파이프라인 구축
- 백엔드 CI CD 트러블슈팅
- Lombok Annotation Processor 의존성을 추가한 이유
- 2차 스프린트 기준 ERD
- DTO 검증하기
- ProblemDetail
- Fork된 레포지토리 PR에서 CI Secrets 접근 문제 해결
- AWS CloudWatch 모니터링
- 스프링 메트릭 모니터링 구축 방법
- 로깅과 Logback에 대해 알아보아요.
- 백엔드 CD 파이프라인 Ver.2
- 요청, 응답 로그에 correlationId 를 추가하자!
- 3차 스프린트 기준 ERD
- 더미데이터 생성하고 실행하기
- 쿼리 성능 개선 결과
- 테이블별 인덱스 설정 목록
- 사용자 증가 시 발생할 수 있는 문제 상황과 개선 방안
- k6를 사용한 서버 부하 테스트
- 6차 스프린트 기준 ERD
- Query Performance Improvement Results
- 테스트 전략 및 CI 설정
- CI CD 구조
- 배포 전, 로컬에서 로그인 기능 포함 테스트해보는 법
- stylelint 적용기
- 내 작업 브랜치 중간에 Merge된 동료의 작업물을 넣고 싶다면 pull vs rebase
- [TS] Webpack config
- [TS] Webpack 환경에서 MSW v2 이슈
- [TS] webpack에서 react‐router‐dom 적용 안됨
- 2024.07.28 새 기획 회의
- 2024.07.26 2차 데모데이 후 회의
- 2024.07.11 백엔드 논의 좀 할게요
- 2024.07.11 백엔드 ERD 회의
- 2024.07.09 깃 브랜치 전략, PR 템플릿 회의
- 2024.07.03 주제 선정 회의
- 2023.07.03 팀빌딩데이 킥오프 회의
- 2023.08.07 3차 스프린트 중간회고