Skip to content

1차: 요구사항 개발

Park minji edited this page Sep 4, 2024 · 24 revisions

🛠️ 개발 주요 사항

🔺 재고 수량 관리 시 동시성 문제

  • 발생 지점: 티켓 구매 시 현재 재고 확인 후 재고 감소하는 로직
  • 원인: 현재 재고 수보다 더 많은 스레드가 재고 확인 시에는 재고가 존재함을 확인하고 재고를 차감하는 과정에서 실제 재고 수량보다 더 많은 구매가 이루어질 수 있음
    • Check-And-Act 패턴
  • 해결: 선착순이어야 하고, 동시 요청이 많은 기능이므로 티켓 재고 확인 시 mysql의 select for update를 사용하여 해결함
    • 낙관락은 선착순이 보장되지 않고, 동시 요청에서 재시도 부하가 추가로 발생하므로 사용하지 않음

⚡ 쿼리 최적화

  • 쿼리 성능 분석
  • 인덱스 최적화
  • 커넥션 풀 설정

🗄️ 캐싱

  • 캐시 전략 정의
  • Caffeine 캐시 활용
  • 캐시 무효화 및 동기화 전략

🚀 성능 테스트

테스트 계획 수립

  • 동시 접속자 수: 3000명, 5000명, 7000명
  • 시나리오: 동시 접속자들이 다음 순서대로 api 요청
      1. 티켓 구매 권한 획득
      1. 티켓 구매 미리보기 조회
      1. 티켓 구매
    • 참고) 현재 api 요청 실패 시 다음 api를 요청하지 않음
  • 검증: 상태 코드가 200인지 여부, 티켓 구매 성공한 요청 수와 mysql 티켓 구매 수 일치 여부
  • 핵심 지표: 각 api 응답 시간

결과 분석

Screenshot 2024-09-04 at 1 32 37 PM
  • 티켓 구매 미리보기 조회, 티켓 구매 권한 획득, 티켓 구매 순으로 api 응답 시간이 짧음
    • 티켓 구매 미리보기 조회 api의 응답 시간이 긴 이유는 티켓 구매 권한 획득 api의 응답 시간이 길기 때문일 수 있음
      • tomcat이 현재 처리할 수 없는 요청은 accept queue에 저장되는데, accept queue에 저장된 요청은 처리 진행 중인 요청이 끝나야 처리되므로 처리 진행 중인 요청의 처리 시간만큼 딜레이가 발생하기 때문

결론

티켓 구매 권한 획득 시 티켓 재고 수 차감 로직의 락 병목 해결 필요