문제 상황
현재 Redis의 분산 락을 사용하여 부하 테스트를 진행하였을 때 비관적 락보다 http req 실패 횟수가 더 많고 사용자에게 응답하는 시간이 더 긴 것 같아서 분산 락이라는 것이 원래 이런 것인지 아니면 현재 잘못 사용되고 있는 것인지 궁금합니다.
혹은 AOP 관련 트랜잭션 거는 타이밍에서 문제가 발생할수도 있을 거 같은데 그것에 대한 조언도 부탁드립니다!
부하 테스트 시나리오 로직
트래픽 패턴 (Traffic Pattern)
- 가상 사용자 (VU): 최대 50명
- 총 테스트 시간: 40초 (짧은 시간 동안 집중 부하)
- 진행 단계 (Stages):
- 진입 (5초): 0명 → 50명 급증 (사용자가 순식간에 경매장에 입장)
- 유지 (30초): 50명이 지속적으로 입찰 시도 (최대 부하 구간)
- 퇴장 (5초): 50명 → 0명 (테스트 종료)
- 요청 간격: sleep(Math.random())을 통해 유저마다 0~1초 사이의 랜덤 텀을 두고 입찰을 진행합니다. 기계적인 간격이 아니라 실제 사람처럼 비정기적으로 클릭하는 패턴을 예상하고 이와 같이 진행하였습니다.
- 동작 방식:
- 1번째 요청: 1,000원 + (0 * 100) = 1,000원 입찰
- 50번째 요청: 1,000원 + (49 * 100) = 5,900원 입찰
- 1,000번째 요청: 1,000원 + (999 * 100) = 100,900원 입찰
- 의도:
- 시간이 지날수록 입찰 금액이 무조건 전보다 높아지도록 설정했습니다.
- 모든 요청이 "유효한 가격(현재가보다 높음)"을 들고 오기 때문에, 서버와 DB는 실질적인 락(Lock) 경합과 쓰기(Write) 작업을 수행해야 하도록 설정되어 있습니다.
- 사용자 풀: tester_1 ~ tester_1000 (1,000명)
- 동시 참여: 그중 매순간 50명이 랜덤으로 선택되어 입찰에 참여합니다.
- 타겟 경매: 9999번 경매 상품 하나에 모든 부하가 집중됩니다. (Hot Item 시나리오)
현재 입찰 생성 로직(비관적 락일때)
1. 트랜잭션 시작 & 데이터 조회 (Lock 획득)
- @Transactional: 메서드 전체가 하나의 트랜잭션으로 묶입니다.
- 회원 조회: support.getPublicMember로 입찰자 정보를 가져옵니다.