1️⃣ 동시성 제어를 하는 이유
공연 예매 서비스에서는 수많은 사용자가 동시에 동일한 좌석을 클릭할 수 있다.
예를 들면, A-1 좌석에 대해 100명의 사용자가 거의 동시에 예매 버튼을 누른다면, 단 1명만 예매에 성공해야 한다.
하지만 별도의 동시성 제어 없이 구현된 서비스라면, 이 좌석이 동시에 여러 명에게 중복 예약되는 치명적인 문제가 발생할 수 있다.
이를 해결하기 위한 핵심 기술이 바로 분산 락(Distributed Lock)
2️⃣ 분산 락(Distributed Lock)이란?
분산 락이란, 다중 인스턴스 환경에서 동시에 같은 자원에 접근하는 것을 제어하기 위한 메커니즘
여러 서버 혹은 스레드가 동시에 같은 좌석을 예약하려는 상황에서 단 하나만 성공하도록 보장하는 방식
DB Lock, Redis 차이
| 방식 | 특징 |
| DB Lock | 트랜잭션 단위에서 락 가능하지만, 성능 저하/데드락/스케일 아웃 한계 |
| Redis Lock | 빠르고 가볍고, 분산 환경에서도 유연하게 확장 가능 |
3️⃣ Lettuce란?
Lettuce는 비동기, 넌블로킹 기반의 Redis 클라이언트
Spring Data Redis에서 기본으로 제공되며, Reactive 환경에 적합하고 커넥션 풀도 가볍다.
Lettuce vs Redisson
| 구분 | Lettuce | Redisson |
| 성격 | 비동기/Reactive | 동기 + 다양한 분산 구조 지원 |
| 락 구현 | 직접 구현해야 함 | 고수준 API 제공 |
| 학습 곡선 | 낮음 | 약간 높음 |
| 사용 목적 | 간단한 락/캐시 제어 | 고급 분산 구조 필요 시 |
4️⃣ Redis 기반 분산 락의 원리
핵심 명령어 - SETNX
SET lock:seat:A-1 UUID NX PX 5000
- NX : key가 없을 때만 설정
- PX 5000 : 만료시간 5초 설정
- UUID : 락 소유자 식별
락 해제 - Lua Script 활용
락 소유자 확인 후, 맞을 때만 삭제
if redis.call("get", KEYS[1]) == ARGV[1]
then return redis.call("del", KEYS[1])
else return 0
end
락이 내가 소유한 것일 때만 해제되도록 보장
'SPRING' 카테고리의 다른 글
| [SPRING] Lettuce 분산 락 트러블슈팅 (1) | 2025.05.28 |
|---|---|
| [SPRING] Lettuce 분산 락 구현 (1) | 2025.05.27 |
| [SPRING] 커스텀 메트릭 수집 및 시각화 (2) | 2025.05.20 |
| [SPRING] 메트릭 기반 모니터링 시스템(Prometheus, Grafana) (2) | 2025.05.19 |
| [SPRING] 조건 검색 개선 3탄 (분리 조회,Projection, 복합 인덱스) (3) | 2025.05.15 |