Playball Logo

Command Palette

Search for a command to run...

목차 열기

부하테스트 개요

PlayBall 백엔드는 staging 환경(AWS)에서 k6 기반 부하테스트를 3일간 수행했습니다. AS-IS 베이스라인 측정부터 Phase 1~4 최적화까지, 각 단계의 병목 지점과 개선 효과를 수치로 검증했습니다.


1. 테스트 환경

1.1 인프라 스펙

구분스펙비고
환경staging (AWS)api.staging.playball.one
DB 인스턴스db.t4g.small (PostgreSQL 16)max_connections = 270 — 실제 한계선
Redis (공용)ElastiCache Redis 7인증·분산락·캐시
Redis (Queue)ElastiCache Redis 7 (별도)대기열 ZSET 전용
KafkaApache Kafka 3.7.1이벤트 메시징
KubernetesEKS (Istio Gateway + mTLS)Envoy Proxy

1.2 서비스별 포트/역할

서비스포트역할
API-Gateway8085JWT 중앙 검증, 라우팅, Rate Limiting, 봇 차단
Auth-Guard8080Kakao OAuth, JWT 발급/갱신(RTR), 유저 차단
Queue8081Redis ZSET 대기열, Admission Token 발급
Seat8082좌석 추천/배정, Redisson 분산 락, Hold 관리
Order-Core8083주문 생성, 결제 처리, 마이페이지

1.3 기술 스택

  • Java 21 LTS, Spring Boot 4.0.2, Spring Cloud 2025.1.1
  • PostgreSQL 16 (HikariCP), Redis 7, Kafka 3.7.1
  • Caffeine 3.x (로컬 캐시), Redisson 3.44.0 (분산 락)
  • Resilience4j (Retry, Circuit Breaker)

2. 테스트 도구: k6

k6는 Grafana Labs의 Go 기반 오픈소스 부하 테스트 도구입니다. JavaScript로 테스트 시나리오를 작성하며, 수천 VU(Virtual User) 동시 시뮬레이션에 최적화되어 있습니다.

2.1 기본 개념

개념의미
VU (Virtual User)가상 사용자. 한 VU는 1개 스레드에서 순차적으로 요청을 반복 실행
IterationVU가 시나리오를 1회 실행하는 단위
Duration테스트 총 실행 시간
Ramp-upVU를 점진적으로 늘리는 구간
RPSRequests Per Second (초당 요청 수)
Percentile (P50/P95/P99)응답 시간 분포에서 하위 50%/95%/99% 지점의 값

2.2 본 프로젝트의 k6 Controller

  • 저장소: 304-goormgb-k6-operators
  • 각 Flow 시나리오: k6-controller/scripts/{auth|queue|seat|recommendation|order}/flow.js
  • 웹 UI에서 VU/Duration 설정 후 실행 → 실시간 대시보드로 결과 확인
  • 결과: k6-test-result-{timestamp}_load.md 형태로 저장

3. 측정 메트릭

3.1 HTTP 레벨

메트릭설명목표
http_reqs총 요청 수
http_req_duration요청 완료까지 소요 시간
http_req_duration{p50}중앙값 응답 시간
http_req_duration{p95}상위 95% 응답 시간< 1,000ms
http_req_duration{p99}상위 99% 응답 시간< 2,000ms
http_req_failed실패율< 1%

3.2 상태 코드 분포

상태의미주의
2xx성공
400잘못된 요청DTO 유효성 검증 실패
401인증 실패토큰 만료/위조
403권한 없음봇 차단, Rate Limit
404리소스 없음연석 부족, Admission Token 만료
409충돌 (경합)좌석 Hold 경합 — 정상 동시성 제어 결과
410GoneAdmission Token 만료
429Too Many RequestsRate Limiting 동작
503Service UnavailableEnvoy upstream connect timeout — 병목 신호

3.3 k6 Custom Metrics (본 프로젝트 전용)

큐 관련

  • queue_ready_count: 대기열에서 READY 상태로 승격된 VU 수
  • queue_fail_count: READY 실패 VU 수
  • queue_wait_seconds: 큐 진입 → READY까지 실제 대기 시간

추천 배정 관련

  • rec_assign_success: 좌석 배정 성공 수
  • rec_assign_contention: 409 경합 발생 수
  • rec_assign_no_seat: 404 연석 없음
  • rec_real_consecutive: 실연석 배정 성공
  • rec_semi_consecutive: 준연석 배정 성공

좌석 Hold (포도알) 관련

  • seat_hold_final_success: 재시도 포함 최종 성공 VU
  • seat_hold_final_fail: 모든 블럭 시도 후 실패 VU
  • seat_hold_contention: 이선좌(409) 총 발생 건수
  • seat_hold_attempts: VU당 시도 횟수 분포

4. 백엔드 모니터링 지표

k6 외부 측정값과 함께, 백엔드 내부 지표도 Prometheus로 수집합니다.

4.1 DB 관련

지표의미
hikaricp_connections_active현재 사용 중인 커넥션 수
hikaricp_connections_idle유휴 커넥션 수
hikaricp_connections_pending커넥션 획득을 기다리는 스레드 수 (핵심 지표)
hikaricp_connections_max풀 최대 크기
postgres_max_connectionsDB 서버 측 최대 연결 수 (270)
rds_cpu_utilizationRDS CPU 사용률

4.2 JVM / Tomcat

지표의미
jvm_threads_live전체 JVM 스레드 수
tomcat_threads_busy작업 중인 Tomcat 워커 스레드 수
tomcat_threads_maxTomcat 최대 워커 수 (설정값)
tomcat_connections_current현재 TCP 연결 수
tomcat_sessions_active활성 세션 수

4.3 캐시 관련

지표의미
cache_gets{result=hit}Caffeine 캐시 hit 수
cache_gets{result=miss}Caffeine 캐시 miss 수
cache_evictionseviction 발생 수
cache_size현재 캐시 엔트리 수
— 조회 경로/actuator/metrics/cache.gets

4.4 Redis / 분산 락

지표의미
ticketing_seat_lock_wait_secondsRedisson 분산 락 획득 대기 시간
ticketing_seat_hold_fail_total{reason}Hold 실패 사유별 카운터
ticketing_seat_recommend_degrade_total준연석 폴백 발생

5. 부하 패턴

k6 실행 시 3단계 패턴을 사용합니다.

VU 수
 ▲
 │
1000│          ┌─────────────┐
 │            /               \
 │           /                 \
  0└─────────/─────────────────\─────── 시간 →
        Ramp-up    유지          Ramp-down
         ~30s     ~2~3min         ~30s
  • Ramp-up: VU를 0 → 목표치까지 점진적으로 증가 (급격한 부하로 인한 오탐 방지)
  • 유지 (Steady state): 목표 VU를 일정 시간 유지 (성능 측정 구간)
  • Ramp-down: 정상 종료

6. 3일간 테스트 시간표

일자단계내용
2026-04-1401~03AS-IS 베이스라인 측정 (아무 최적화 없는 상태)
2026-04-1504~151차 Caffeine 캐싱, Phase 1~2 적용 및 검증
2026-04-1616~21Phase 3~4 완료 후 엔드투엔드 검증, 추천 ON/OFF 전체 플로우

각 단계별 상세 결과는 테스트별 결과 요약 페이지를 참조하세요.