이벤트 참가 관리에서 동시성 제어 최적화
이벤트 참가 시스템은 제한된 참가자 수를 관리하면서 동시에 다수의 요청을 처리해야 하므로, 데이터의 무결성과 시스템 안정성을 보장하기 위한 동시성 제어 전략이 필수적이다. 본 프로젝트에서는 이러한 요구를 충족하기 위해 다양한 동시성 제어 방식을 테스트하고 최적의 방법을 선정하였다.
테스트 환경 구성
테스트는 기본 테스트와 부하 테스트로 나누어 진행하였다.
- 기본 테스트: 낮은 동시성 환경에서 데이터 무결성과 안정성을 검증하였다. 이 테스트는 30~100명의 사용자 요청을 시뮬레이션하여 각 동시성 제어 방식의 특성과 안정성을 평가하였다.
- 부하 테스트: 10초 동안 500명의 동시 요청을 처리하며, 고부하 환경에서의 데이터 무결성과 성능을 평가하였다. JMeter를 활용하여 실사용 환경에서 발생할 수 있는 높은 동시성을 시뮬레이션하였다.
테스트 방식
- 트랜잭션 기반 제어(@Transactional)
- 기본적인 동시성 제어 방식으로, 트랜잭션을 이용해 데이터의 무결성을 보장하려는 방식이다.
- 낙관적 락(Optimistic Lock)
- 데이터 변경 충돌을 허용하되, 이를 감지하여 재시도를 통해 충돌을 해결하는 방식이다.
- 비관적 락(Pessimistic Lock)
- 데이터에 대한 접근을 락을 통해 완전히 제어하여 충돌을 방지하는 방식이다.
- Redis 분산 락(Distributed Lock)
- Redis를 활용해 키를 기반으로 락을 관리하여, 요청 순서와 데이터 무결성을 보장하는 방식이다.
기본 테스트 결과
테스트 방식 | 참가 제한 | 테스트 참가 인원 | 결과 요약 |
트랜잭션 기반 제어 | 10명 | 30명 |
데이터 무결성 보장 실패. 이벤트 테이블에는 9명, 참가자 테이블에는 16명 저장.
|
낙관적 락 | 10명 | 30명, 100명 |
30명에서는 안정적이나, 100명에서는 충돌 재시도로 성능 저하 발생.
|
비관적 락 | 10명 | 30명 |
충돌 없이 요청 처리. 데이터 일관성 보장. 응답 시간이 다소 길어짐.
|
Redis 분산 락 | 10명 | 100명 |
요청 처리 순서 및 데이터 무결성 안정적으로 유지. 가장 우수한 성능.
|
부하 테스트 결과
테스트 방식 | 에러율 (%) | 평균 응답 시간 (ms) | 최대 응답 시간 (ms) | 결과 요약 |
트랜잭션 기반 제어 | 48.20% | 743ms | 2220ms |
높은 에러율과 긴 응답 시간. 데이터 무결성 보장 실패.
|
낙관적 락 | 37.60% | 42ms | 351ms |
재시도 로직으로 성능 저하 발생.
|
비관적 락 | 0% | 942ms | 2110ms |
데이터 일관성 보장. 처리 속도가 다소 느림.
|
Redis 분산 락 | 0% | 28ms | 145ms |
데이터 무결성과 성능 모두 우수. 가장 안정적인 성능 기록.
|
분석 및 결론
1. 트랜잭션 기반 제어
- 문제점: 데이터 충돌 및 순서 꼬임 발생. 높은 동시성 환경에서 데이터 무결성 보장 실패.
- 평가: 동시 요청이 많은 환경에는 부적합.
2. 낙관적 락
- 문제점: 충돌 감지 후 재시도로 성능 저하. 충돌 빈도가 높을수록 응답 속도 불안정.
- 평가: 낮은 동시성 환경에서는 유효하나, 고부하 환경에는 한계가 명확.
3. 비관적 락
- 문제점: 락 점유 시간 증가로 인해 응답 속도 느림.
- 평가: 데이터 일관성이 중요할 때 적합하나, 성능은 비효율적
4. Redis 분산 락
- 장점: 요청 순서 보장 및 응답 속도 우수. 데이터 무결성과 성능 모두 보장.
- 평가: 고부하 환경에서도 가장 효율적이며, 프로젝트에 최적화된 동시성 제어 방식으로 선정됨.
최종 결론
Redis 분산 락은 높은 동시성 환경에서도 데이터 무결성과 성능을 모두 보장하며, 안정적인 시스템 동작을 지원한다. 본 프로젝트에서는 Redis 분산 락 방식을 동시성 제어 전략으로 채택하여, 대규모 트래픽 상황에서도 안정적이고 효율적인 이벤트 참가 시스템을 구축하였다.