카테고리 없음
Redis 동시성 제어 과제 구현 방향
스타르타
2024. 11. 27. 12:52
반응형
목표: Redis를 활용한 Lock 구현으로 동시성 이슈 해결
1️⃣ 구현 방향 자료조사 및 단계적 진행
1. 어플리케이션 기획
- 콘서트 티켓팅 시스템으로 설정:
- 특정 시간에 대규모 요청이 몰릴 가능성이 높은 도메인.
- 좌석 선택 및 구매 과정에서 데이터 정합성 유지가 중요.
- 요구사항:
- 좌석은 단 1명만 구매 가능.
- 동시 요청 시, 같은 좌석이 여러 사용자에게 배정되지 않도록 처리.
2. 동시성 이슈 검증 테스트 코드 작성
- 환경 설정:
- ExecutorService를 이용해 다수의 쓰레드에서 동일한 좌석 구매 요청.
- CyclicBarrier를 사용하여 쓰레드가 동시 시작되도록 구현.
- 검증 코드 시나리오:
- 여러 쓰레드가 동일 좌석을 동시에 구매하려고 시도.
- 테스트 시 동시성 문제로 인해 데이터 정합성이 깨지는 상황을 확인.
3. Redis Lock 설계 및 구현
- Lettuce를 이용한 Redis Lock:
- Redis의 SET NX EX 명령어를 활용하여 분산 락 구현.
- Key로는 좌석 ID를 사용:
- 특정 좌석에 대해 Lock을 걸어 동일한 좌석에 대한 중복 처리를 방지.
- 구현 고려 사항:
- Lock 획득 실패 처리:
- Lock 획득에 실패한 요청은 재시도하거나 실패 응답 반환.
- 재시도 시 백오프(backoff) 알고리즘 도입.
- Lock 만료 처리:
- Lock 설정 시 적절한 TTL(Time-To-Live) 지정.
- Redis 다운/지연 시 Lock 해제되지 않을 위험성 대비.
- 왜 Redis를 이용했는가?
- Redis는 고성능 인메모리 데이터 저장소로 빠른 읽기/쓰기 속도를 제공.
- 분산 환경에서 단일 진입점을 제공하여 동시성 이슈를 쉽게 관리 가능.
- Lock 획득 실패 처리:
2️⃣ 선택 기능 (AOP 적용)
- AOP를 이용한 리팩토링:
- Spring AOP를 통해 비즈니스 로직에서 Lock 처리 분리.
- 메소드에 @RedisLock 어노테이션 추가하여 Lock 동작 추상화.
- AOP 내부에서 Redis Lock 획득/해제 처리.
3️⃣ 심화 구현 기능
Redis 대신 MySQL로 Lock 구현
- JPA 비관적 Lock:
- 데이터베이스 수준에서 Lock을 걸어 동시에 같은 데이터를 수정할 수 없도록 제어.
- @Lock(LockModeType.PESSIMISTIC_WRITE)를 사용.
- MySQL Exclusive Lock:
- SQL의 SELECT ... FOR UPDATE를 사용하여 Lock 구현.
- 장단점 분석:
- 장점:
- 데이터베이스와 통합된 Lock으로 별도 설정 없이 사용 가능.
- 트랜잭션과 Lock이 밀접하게 연결.
- 단점:
- 데이터베이스 부하 증가.
- 분산 시스템에 적합하지 않음.
- 장점:
개인적으로 구현한다면...
- Redis 동시성 과제를 선택.
- 이유:
- Redis는 빠른 읽기/쓰기 성능과 분산 환경에서의 유연한 확장성을 제공.
- 실제 대규모 트래픽 상황에서 효과적인 Lock 솔루션.
진행 시 자료조사 및 구현 전략:
- Redis의 SET NX EX 명령어와 Lock 메커니즘 분석.
- Spring Data Redis와 Lettuce 활용법 학습.
- CyclicBarrier를 활용한 동시성 테스트 방법 조사 및 코드 작성.
- AOP 설계를 통한 비즈니스 로직과 Lock 로직 분리.
- Redis 다운타임 시의 대응책 조사 및 구현:
- Lock TTL 설정, 자동 복구 전략 등.
최종적으로 구현할 내용:
- 순간적으로 높은 트래픽이 발생해도 데이터 정합성을 보장하는 Redis 기반 Lock 시스템.
- 검증 가능한 테스트 코드와 AOP 적용으로 유지보수성 강화.
반응형