티켓팅·수강신청처럼 순간적으로 몰리는 대규모 트래픽을 제어하는 실시간 대기열 시스템. Spring WebFlux 논블로킹 리액티브 스택 + Redis Sorted Set으로 서버 증설 없이 유입량을 제어. TDD로 개발.
논블로킹 리액티브 처리, 공정한 선착순, 우선순위까지 — 대기열 시스템의 핵심 과제 해결
WebFlux 리액티브 파이프라인으로 검증 → 용량 확인 → 등록 → 이력 → 알림을 논블로킹 체이닝. 적은 스레드로 수천 개의 동시 연결 처리.
Sorted Set 스코어를 타임스탬프 기반으로 설계하고, VIP는 오프셋을 빼 항상 앞순위를 부여. 자료구조 하나로 우선순위별 차등 진입을 구현.
Redis Sorted Set으로 순위 조회 O(log N). Redis Pub/Sub으로 등록·진입 허용 등 상태 변경을 실시간 알림.
스케줄러가 주기적으로 시스템 허용량만큼 사용자 진입을 허용. 서버가 감당 가능한 범위 내에서만 트래픽이 유입되도록 제어.
등록·진입·이탈 등 모든 대기열 이벤트를 이력으로 적재. 장애 분석과 사용자 문의 대응의 근거 데이터 확보.
Red-Green-Refactor 사이클로 개발. Service Layer 커버리지 92%, 예외 처리 100%. VIP 순위 등 동시성 시나리오도 테스트로 검증.
Spring WebFlux + Reactive Redis로 전 구간 논블로킹. I/O 대기 시간에 다른 작업을 수행해 리소스 효율 극대화, 백프레셔로 메모리 오버플로우 방지.
Mono/Flux chaining · reactive redis templateList(순위 조회 O(N)), Set(순서 없음), Hash(정렬 없음)와 비교 후 삽입·순위·범위 조회 모두 O(log N)인 Sorted Set 선택. 단일 원자 연산으로 동시성 문제 제거.
ZADD · ZRANK · ZCARD — O(log N)스코어 = 유닉스 타임스탬프, VIP는 고정 오프셋을 차감해 "과거에 등록한 것처럼" 처리. 별도 큐 없이 공정한 선착순과 우선순위를 하나의 자료구조에서 해결.
score = timestamp - VIP_PRIORITY_OFFSETRedis Pub/Sub으로 상태 변경을 실시간 전파하고, 스케줄러가 허용량만큼 주기적으로 진입 처리. 대기실 웹 UI에서 순위·예상 시간을 실시간 갱신.
publish → subscribe → SSE/UI update피크 트래픽에 맞춘 서버 증설은 평시 유휴 비용이 과다. 대기열로 유입량을 시스템 허용 범위로 제어하면 안정성과 비용 효율을 동시에 확보하고, 사용자에게는 순위·예상 시간을 투명하게 제공.
대기열은 대량의 짧은 I/O 요청이 몰리는 워크로드. 블로킹 MVC 대비 처리량 3배(30→90 TPS), 스레드 풀 축소로 메모리 40% 절감을 부하 테스트로 검증하고 채택.
List는 순위 조회 O(N), Set은 순서 보장 불가, Hash는 정렬 불가. 삽입·순위·범위 조회가 모두 O(log N)이고 원자적으로 처리되는 Sorted Set이 대기열 요구사항에 정확히 부합.
별도 VIP 큐는 두 큐 간 진입 비율 조정이라는 새 문제를 만듦. 타임스탬프 스코어에서 오프셋을 차감하는 방식으로 하나의 큐 안에서 우선순위를 해결 — 구조 단순성 유지.