비관적 락과 레디스 락 쿠폰 발급 테스트 비교 분석
1. 테스트 환경
- 테스트 도구: nGrinder
- 테스트 스크립트: 로그인 후 쿠폰 발급 API 호출 (동일한 API 테스트)
- Vuser 수: 99명 → 99명의 가상 사용자가 동시에 부하를 발생시킴
- Processes/Threads: 3 프로세스, 각 프로세스당 33 쓰레드
- Duration: 1분 → 테스트는 1분간 진행
- Ramp-Up: 비활성화 (즉시 99명의 사용자 부하 발생)
- 테스트 조건:
- 비관적 락: 데이터베이스 수준에서 락 관리
- 레디스 락: RedissonClient를 이용한 분산 락 관리
2. 결과 비교
지표 | 비관적 락 | 레디스 락 | 비교 |
---|
TPS (초당 처리율) | 90.5 | 3,938.0 | 레디스 락이 약 43배 이상 우수 |
Peak TPS (최대 TPS) | 117 | 4,811 | 레디스 락이 압도적으로 높음 |
Mean Test Time | 1,089.81 ms | 22.95 ms | 레디스 락이 47배 빠름 |
Executed Tests | 4,958 | 214,969 | 레디스 락이 약 43배 많은 요청을 처리 |
Successful Tests | 4,958 | 214,969 | 모두 100% 성공 |
Errors | 0 | 0 | 오류 없음 |
3. 성능 분석
비관적 락
- TPS: 90.5
- Mean Test Time: 1,089.81 ms
비관적 락은 데이터베이스 수준에서 자원에 대한 락을 독점하기 때문에 경합이 심해질수록 대기 시간이 길어지고, 동시 요청을 처리하는 데 병목이 발생.
- 약 5,000건의 요청만 성공적으로 처리되었으며, 초당 처리량이 90~117 TPS로 제한.
주요 원인:
- 락을 획득한 트랜잭션이 완료될 때까지 다른 쓰레드가 대기해야 함.
레디스 락
- TPS: 3,938.0
- Mean Test Time: 22.95 ms
레디스 락은 Redis의 분산 락 기능을 활용하여 더 빠르게 락을 관리하고 해제. 트랜잭션 부담이 줄어들어 더 많은 동시 요청을 효율적으로 처리.
- 약 214,969건의 요청을 처리하였으며, 초당 처리량은 3,938 TPS에 달한다.
주요 원인:
- 레디스 락은 락의 획득/해제가 비동기적이고 빠르게 이루어지며, 데이터베이스에 직접 락을 걸지 않음.
4. 결론
- 레디스 락은 비관적 락과 비교하여 성능이 월등히 우수합니다.
- 특히 TPS와 평균 응답 시간에서 큰 차이를 보이며, 동시 요청이 많은 환경에서 레디스 락이 훨씬 더 적합.
| 결론 | 비관적 락은 데이터 무결성이 절대적으로 중요한 시스템에 적합하지만, 성능 병목이 발생할 수 있다. |
| 레디스 락은 동시성이 중요한 대규모 시스템에서 성능 병목을 해소하는 데 효과적. ✅ |
5. 제언
- 대규모 동시 요청을 처리해야 하는 시스템에서는 레디스 락을 사용하는 것이 권장.
- 데이터 무결성이 절대적으로 필요하고 경합이 적은 시스템에서는 비관적 락을 사용할 수 있다.