이 프로젝트는 콘서트 예매 시스템에서 선착순 예약을 공정하게 처리하기 위해 대기열 처리 시스템의 성능과 안정성을 검증하는 데 목적이 있다. 대기열 진입 시점에 급격한 사용자 요청이 몰리는 상황을 스파이크 트래픽으로 모델링하여 시스템의 병목 현상, 응답 시간, 처리량을 정량적으로 측정하였다.
대상 API는 스크립트를 통해 호출되는 대기열 토큰 발급 API이다. 이 API는 Redis 기반 SortedSet 큐에 사용자 토큰을 삽입하며 동시에 중복 체크와 TTL 설정, 발급 성공 여부 확인 등을 수행한다.
POST /token?concertId={CONCERT_ID}
구분 | 상세 내용 | 비고 |
---|---|---|
애플리케이션 서버 | Spring Boot 기반 예약 API | 포트: 8081 |
모니터링 도구 | Prometheus + cadvisor | 포트: 9090 / 8082 |
시각화 도구 | Grafana | 포트: 3000 |
부하 테스트 도구 | k6 (CLI 기반 스크립트 실행) | token-test.js 사용 |
import http from 'k6/http';
import { check, sleep } from 'k6';
import { htmlReport } from '<https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js>';
export const options = {
scenarios: {
spike_test: {
executor: 'ramping-arrival-rate',
startRate: 10,
timeUnit: '1s',
preAllocatedVUs: 2000,
maxVUs: 5000,
stages: [
{ duration: '10s', target: 1000 },
{ duration: '20s', target: 10000 },
{ duration: '10s', target: 0 },
],
},
},
thresholds: {
http_req_duration: ['p(95)<1000'],
http_req_failed: ['rate<0.05'],
checks: ['rate>0.99'],
},
};
const CONCERT_ID = __ENV.CONCERT_ID || 1;
const BASE_URL = __ENV.BASE_URL || '<http://localhost:8081>';
export default function () {
const userId = Math.floor(Math.random() * 1000000) + 1;
const url = `${BASE_URL}/token?concertId=${CONCERT_ID}`;
const headers = { 'X-USER-ID': userId.toString() };
const res = http.post(url, null, { headers });
// 성공(202) 또는 선착순 실패(409)는 OK로 처리
check(res, {
'status is 202 or 409': (r) => r.status === 202 || r.status === 409,
'no 5xx error': (r) => r.status < 500
});
sleep(1);
}
export function handleSummary(data) {
return {
'summary.html': htmlReport(data, { title: '대기열 토큰 발급 Spike Test 결과' }),
};
}