본문으로 건너뛰기
개인 1만 동시 요청 · K6 3,000 TPS · Kafka 3-broker · Prometheus+Grafana

콘서트 예약 서비스

2024-10-05 — 2024-11-30

1만 동시 요청 환경에서 좌석 선점·결제·포인트 충전의 동시성 문제를 시나리오별 하이브리드 락 전략으로 해결한 콘서트 좌석 예약 서비스 — 낙관적 락 + Redisson 분산 락, Redis 캐싱 TPS 15배 향상, Kafka 이벤트 드리븐 아키텍처, K6 부하 테스트 기반 병목 개선

콘서트 예약 서비스 project cover image

시스템 아키텍처

콘서트 예약 서비스 architecture diagram

문제 해결 과정

1

1만 동시 요청 환경에서 좌석 선점 시 동일 좌석 이중 배정 위험

해결 과정

비관적/낙관적/분산 락 3종을 K6로 비교 검증 후, 단일 좌석 경합에 최적인 @Version 낙관적 락 선택

결과

좌석 예약 응답시간 50% 개선 (1,678ms → 835ms), 이중 배정 0건

2

포인트 충전과 결제의 동시 실행 시 잔액 정합성 붕괴

해결 과정

재시도 기반 낙관적 락의 무한 루프 위험을 분석하고, Redisson 분산 락(userWalletLock:{userId})으로 사용자 단위 직렬화

결과

동시 충전/결제 시나리오에서 잔액 정합성 100% 보장

3

콘서트/좌석 조회 TPS가 100에 불과하여 예약 오픈 시 DB 병목

해결 과정

Redis 캐시 레이어 적용 + DB 인덱스 최적화를 병행하여 계층적 캐싱 전략 구현

결과

TPS 100 → 1,500 (15배 향상), DB 쿼리 94% 감소

4

예약 완료 후 결제/알림 처리가 동기 호출로 묶여 도메인 간 강결합

해결 과정

Kafka Transactional Outbox 패턴으로 예약 TX 내 outbox_event 삽입 후 스케줄러가 비동기 발행

결과

도메인 간 결합도 제거, 메시지 유실 방지, 독립 확장 가능

프로젝트 설명

대규모 트래픽 환경에서의 동시성 문제를 다양한 락 전략(비관적 락, 낙관적 락, Redis 분산 락)으로 해결하고, 시나리오별 최적의 동시성 제어 방식을 선정한 프로젝트이다. 좌석 선점에는 낙관적 락, 포인트 충전과 결제에는 Redisson 기반 분산 락을 적용하는 하이브리드 전략을 설계했으며, Redis 캐싱과 DB 인덱싱으로 조회 성능을 최적화하고 Kafka를 활용한 이벤트 기반 아키텍처로 시스템 간 결합도를 낮췄다. K6 부하 테스트를 통해 성능 병목을 식별하고 개선하는 전 과정을 경험했다.

주요 내용

  • 낙관적 락으로 좌석 예약 응답 시간 50% 개선 (1,678ms → 835ms)
  • 시나리오별 하이브리드 락 전략 설계 (낙관적 락 + Redisson 분산 락)
  • Redis 캐싱으로 TPS 15배 향상 (100 → 1,500), DB 쿼리 94% 감소
  • Kafka 이벤트 드리븐 아키텍처로 도메인 간 결합도 제거
  • K6 부하 테스트 기반 성능 병목 식별 및 개선

성과 지표

성과 지표 이전 이후
좌석 예약 응답시간 1,678ms 835ms (-50%)
좌석 조회 TPS 100 1,500 (15x)
DB 쿼리 비율 100% 6% (-94%)

기술 선택 근거

  • 좌석 선점에 @Version 낙관적 락: 단일 좌석 경합에서 비관적 락 대비 처리량 우위, K6 1만 VU 검증
  • 결제·충전에 Redisson 분산 락(userWalletLock:{userId}): 잔액 정합성 필수 트랜잭션에서 재시도 기반 낙관적 락의 무한 루프 위험 회피
  • Redis Sorted Set 대기열: 스코어=Unix timestamp로 입장 순서+만료 시간 이중 활용, DB 대기열 대비 O(log N)
  • Transactional Outbox 패턴: 결제 TX 내 outbox_event 행 삽입 → 스케줄러가 Kafka 발행, 메시지 유실 방지

깨달은 점

  • 비관적/낙관적/분산 락의 트레이드오프를 비교하며 동시성 제어의 본질적 차이를 이해
  • 시나리오별 하이브리드 락 전략 설계로 단일 솔루션이 아닌 맥락 기반 선택의 중요성 학습
  • Redis 캐싱과 DB 인덱스 최적화를 병행하여 읽기 성능을 극대화하는 계층적 캐싱 전략 경험
  • Kafka 기반 이벤트 드리븐 아키텍처로 도메인 간 결합도를 제거하는 비동기 통신 설계 학습

기술 스택

Java Spring Boot JPA Redis MySQL Kafka Docker K6

관련 글

  • JPA 비관적 락과 낙관적 락 및 재시도
  • Spring Boot 콘서트 예약 시나리오 동시성 문제 분석
  • Spring Boot Redis를 활용한 분산 락 구현
  • 캐시(Cache)와 캐싱 전략(Caching Strategy)

관련 링크

  • erd
  • api Spec
  • sequence Diagram
  • requirements
  • project Structure
  • concurrency Analysis
  • caching Strategy
  • index Optimization