선착순 시나리오는 일반적인 커머스의 조회 위주 트래픽과는 결이 다르다.
시스템의 한계를 확인하기 위해 k6를 활용한 Spike Test를 설계했다.
// 테스트 시나리오 (Spike Test)
export const options = {
scenarios: {
// 시나리오 A: 워밍업 (JIT 컴파일러 예열)
warm_up: {
executor: 'constant-vus',
vus: 10,
duration: '30s',
startTime: '0s',
gracefulStop: '5s',
},
// 시나리오 B: 선착순 오픈 (Spike)
// t3.small 1대가 감당할 극한의 상황을 가정
spike: {
executor: 'ramping-vus',
startTime: '35s', // 워밍업 후 실행
startVUs: 0,
stages: [
{ target: 300, duration: '5s' }, // [오픈 직전] 5초 만에 300 VU 투입
{ target: 300, duration: '2m' }, // [오픈 중] 2분간 폭주 상태 유지 -> 병목 지점 확인)
{ target: 0, duration: '10s' }, // [종료] 빠르게 빠짐
],
gracefulRampDown: '10s',
},
},
thresholds: {
'http_req_failed': ['rate<0.01'], // 에러율 1% 미만
'http_req_duration': ['p(95)<1000'], // Redis Cluster 감안하여 1초 이내
},
};
export default function () {
const uniqueId = exec.scenario.iterationInTest; // 유니크 유저 생성
const memberNo = (uniqueId % 20000) + 1; // 동시성 이슈 강화
const payload = JSON.stringify({
productNo: 1,
count: 1,
});
const params = {
headers: { 'Content-Type': 'application/json' },
tags: { name: 'Hot_Order' }
};
// 요청 수행
const res = http.post(`${BASE_URL}/api/v1/orders?memberNo=${memberNo}`, payload, params);
// 부수적인 코드...
}
t3.small (2 vCPU, 2GB RAM) / RDS (db.t4g.micro)